從sysbench中學習Lua
我做事喜歡結果導向,喜歡快速迭代,能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來簡單驗證一下,果然是預設安裝了。
這是這個地方的引用是sysbench在指令碼中繫結的路徑,沒有放到系統級的環境變數中。LuaJIT裡呼叫c還是很流暢的,比如可以寫一個簡單的指令碼,如下:
該例子參考了網路資源,執行結果如下:
然後我們就可以暫時先來系統的學習一下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程式碼裡的邏輯總結出來。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2148317/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- lua 學習總結
- Lua 學習筆記(上)筆記
- 學習Lua的意義
- Lua學習記錄 20201027
- Lua學習(二)物件導向物件
- redis學習(八) Lua語法Redis
- lua課程學習筆記筆記
- 從錯誤中學習
- 熱更新語言--lua學習筆記筆記
- redis原始碼學習之lua執行原理Redis原始碼
- 《Lua-in-ConTeXt》09:學一點 LuaContext
- sysbench
- lua~IDEA中除錯lua指令碼Idea除錯指令碼
- C#與Lua語言學習對比一C#
- 從bootstrap原始碼中學習Sass(一)boot原始碼
- sysbench for dm
- Unity熱更學習--Lua指令碼使用C#中的事件、委託和協程Unity指令碼C#事件
- 從 Quora 的 187 個問題中學習機器學習和 NLP機器學習
- 從學習語文聊聊如何學習
- 熱更學習筆記--toLau中lua指令碼對C#中列舉和陣列的訪問筆記指令碼C#陣列
- 從 Dropdown 的 React 實現中學習到的React
- 熱更學習筆記10~11----lua呼叫C#中的List和Dictionary、擴充類中的方法筆記C#
- 從零學習SpringSecuritySpringGse
- 「從原始碼中學習」Vue原始碼中的JS騷操作原始碼VueJS
- 從零開始學習機器學習機器學習
- xLua中C#呼叫LuaC#
- xLua中Lua呼叫C#C#
- 從別人的程式碼中學習golang系列--01Golang
- 從別人的程式碼中學習golang系列--03Golang
- 從別人的程式碼中學習golang系列--02Golang
- 高效學習Linux核心——從原始碼中的宏下手Linux原始碼
- sysbench 測試MySQLMySql
- Redis學習筆記(三)使用Lua指令碼實現分散式鎖Redis筆記指令碼分散式
- 深度學習——學習目錄——學習中……深度學習
- toLua中Lua呼叫C#中的類C#
- 機器學習|從未標記的視訊中學習跨模態時間表示機器學習
- 從《劍與家園》中學習戰鬥策略設計
- 從《爐石傳說》中學習隨機性設計隨機
- 「從原始碼中學習」徹底理解Vue選項Props原始碼Vue