从sysbench中学习Lua-阿里云开发者社区

开发者社区> jeanron100> 正文

从sysbench中学习Lua

简介: 我做事喜欢结果导向,喜欢快速迭代,能10分钟搞定,绝对不愿意花15分钟。但是技术行当,还是得耐得住寂寞,因为很多事情10分钟搞不定,可能100分钟,1000分钟也搞不定,但是不代表我们真搞不定,需要花一些时间,花一些额外的代价来补课。
+关注继续查看

img_6f0ab762530d1821827720fe833c184e.jpe

我做事喜欢结果导向,喜欢快速迭代,能10分钟搞定,绝对不愿意花15分钟。但是技术行当,还是得耐得住寂寞,因为很多事情10分钟搞不定,可能100分钟,1000分钟也搞不定,但是不代表我们真搞不定,需要花一些时间,花一些额外的代价来补课。水到渠成的时候,自己也得到了成长。

对于sysbench也是如此,里面用到了大量的lua模板,而且lua模板是sysbench压测的必备选项,所以我们要更好的理解它的实现逻辑,如果可以根据自己的需求来定制它的实现,使得符合真实业务,这种基准测试会更有意义。想到了这些,说干就干。

我们从sysbench的角度来理解Lua,开始Lua的学习旅程。

sysbench启动测试的时候,会在头部显示如下的信息:

sysbench 1.1.0 (using bundled LuaJIT2.1.0-beta3)

这句话信息量很大,我们可以慢慢分析,可以明显看到sysbench匹配的这个Lua是选用了LuaJIT,是一个beta版本。而如此一来,我们就需要确认两点,一个是Lua调用c的方法,在这里使用了LuaJIT,那么应该是使用ffi库来调用c了,否则一般是使用c的Lua C API这种方式。

这个信息可以在sysbench基础的lua文件中看到如下的内容印证。

local ffi = require("ffi")

接着第二个问题,系统层面是默认安装了Lua,基本上是5.1以上的版本,但是LuaJIT我们印象中是不曾安装过。安装sysbench的时候是否又安装了LuaJIT呢?我们使用find来简单验证一下,果然是默认安装了。

img_8ece63cd656b4b9d0183f315a933a486.jpe

这是这个地方的引用是sysbench在脚本中绑定的路径,没有放到系统级的环境变量中。LuaJIT里调用c还是很流畅的,比如可以写一个简单的脚本,如下:

img_d0ee176bfc928bbd6688034bc625f7c6.png

该例子参考了网络资源,执行结果如下:

img_7a531c4f7fa31cd31319b3c676bb8c37.png

然后我们就可以暂时先来系统的学习一下Lua,然后抓住要点之后再来看sysbench的代码就会容易多了。

先来一个最简单的Hello World

> print("Hello World!")

Hello World!

> print 'hello world'

hello world

Lua中的保留字有下面的这些:

and break do else

elseif end false for

function if in local

nil not or repeat

return then true until

while

如果要添加注释,有单行和多行,多行可以使用--[[ xxx --]]的方式来标注。

> -- this is a test comment --单行注释

> --[[ --多行注释

>> this is a test,line 1

>> this is a test comment line 2

>> this is a test comment line 3

>> --]]

如果变量b没有赋值,就会显示为nil,我们可以基于这个方式来处理一下变量值。

> print (b)

nil

> b=10

> print b --这种命名方式是不达标的

stdin:1: '=' expected near 'b'

> print(b)

10

然后就开始逐步有难度了。

我们看看学习套路之数据类型, Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

要验证还是比较容易的,使用type方法即可。

> print (type('hello world'))

string

> print (type(10+3))

number

> print (type(print))

function

> print (type(type))

function

> print (type(nil))

nil

> print (type(true))

boolean

> print (type(type(x)))

string

遍历元组

如果有键值对这种形式的数据,可以通过循环映射的方式来返回,下面的两个实例,逻辑看起来是一样的,最后的输出还是有较大的差别。

> tab1 = {key1='val1',key2='val2','val3'}

> for k,v in pairs(tab1) do

>> print(k.."-"..v)

>> end

1-val3

key1-val1

key2-val2

> tab1 = {key1='val1',key2='val2',key3='val3'}

> for k,v in pairs(tab1) do

print(k.."-"..v)

end

key1-val1

key3-val3

key2-val2

关于类型转换,是在程序中很常见的一类处理方式,数值转换为字符型,或者字符型转换为数字,这一点上Lua的表现还不错。

> print("2" + 6)

8

> print('2' + 6)

8

>

> print ("2"+"6")

8

> print ("2+6")

2+6

> print ("-2e2"*"6")

-1200

> print ("error"+1)

stdin:1: attempt to perform arithmetic on a string value

stack traceback:

stdin:1: in main chunk

[C]: ?

>

> print ("a".."b")

ab

> print(123..456)

stdin:1: malformed number near '123..456'

> print(123 .. 456)

123456

如果要计算字符的长度,可使用len方法或者变量的方式。

> len = "www.jeanron100.com"

> print(#len)

18

> print(#"www.jeanron100.com")

18

如果要初始化table,则可以使用如下的方式:

比如声明这样一个table a,然后赋值取值做数据处理,里面比较重要的就是下标的处理了,Lua的实现下标是从1开始。

> a = {}

> a["key"] = "value"

> key=10

> a[key]=100

> a[key]=a[key]+1000

> for k,v in pairs(a) do

>> print(k .. ":" .. v)

>> end

key:value

10:1100

如果要强化一下循环的部分,可以参考下面的例子,把fruits里的元素都循环输出。

[root@oel641 lua]# cat test1.lua

local fruits={'apple','orange','banana'}

for key,val in pairs(fruits) do

print("key",key)

end

[root@oel641 lua]# lua test1.lua

key 1

key 2

key 3

还有Lua中的函数,甚至支持匿名函数。

[root@oel641 lua]# cat test3.lua

function factorial1(n)

if n == 0 then

return 1

else

return n * factorial1(n-1)

end

end

print (factorial1(5))

factorial2=factorial1

print(factorial2(5))

这段代码和c非常相似,但是Lua里面比较有意思,函数可以更加灵活的使用,直接通过类似赋值的方式就搞定了,输出结果如下:

[root@oel641 lua]# lua test3.lua

120

120

大体测试了这些内容,随后会把sysbench代码里的逻辑总结出来。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10095 0
受益一生的15个学习习惯
1) 总带一本书 无论你花一年或者一周去读一本书,这都无所谓。随身带着它,当你有时间的时候就努力去阅读,通读。每天只需花挤出来的几分钟,一周就能读一本。那么一年至少就能读50本。   2) 建一个“要学习什么”的名单 我们都有需要做的事情的清单。
739 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10886 0
关于INNODB SYSTEM RECORD infimum和supremum的学习和实验研究
关于INNODB SYSTEM RECORD infimum和supremum的学习和实验研究 接上一篇  http://blog.itpub.net/7728585/viewspace-2063921/关于MYSQL INNODB index page head...
1001 0
JS-元素大小深入学习-offset、client、scroll等学习研究笔记
一些属性和方法,在dom中没有规定如何确定页面中元素大小的情况下诞生。。。 1.偏移量(offset dimension)  测试代码:   1 DOCTYPE html> 2 3 4 5 offset偏移量学习 6 7...
614 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13893 0
runtime system学习笔记
经常听到runtime这个词,却不知是做什么的,最近在一本书上看到了它的一点相关知识,记录如下: 1、Object-C是一门动态编程语言,具有动态特性,所以,OC不仅需要编译环境,也需要运行时系统(runtime system)来执行编译好的代码。
642 0
使用Spark SQL进行流式机器学习计算(上)
今天来和大家简单说一下如何使用Spark SQL进行流式数据的机器学习处理
1720 0
+关注
jeanron100
Oracle ACE,《Oracle DBA工作笔记》作者 现就职于国内某互联网公司,擅长数据管理,数据迁移,性能优化,目前专注于开源技术,运维自动化和性能优化。
1180
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载