日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

lua的性能优化

發(fā)布時(shí)間:2025/3/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua的性能优化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Roberto Ierusalimschy寫(xiě)過(guò)經(jīng)典的Lua 性能提示的文章,鏈接地址>>

我通過(guò)實(shí)際的代碼來(lái)驗(yàn)證,發(fā)現(xiàn)一個(gè)問(wèn)題。當(dāng)我使用 LuaStudio 運(yùn)行時(shí),發(fā)現(xiàn)結(jié)果反而與提示相反,甚是奇怪,而使用luac進(jìn)行運(yùn)行,與作者給予的提示相符,在某些地方性能可能有優(yōu)化,比如讀取35kb的文件時(shí),時(shí)間還是比較快的(可能5.1版本做過(guò)優(yōu)化了)。

?

日常的Lua編碼中,需要注意以下幾點(diǎn):

1)多使用local

print(_VERSION)local startTime, endTimestartTime = os.clock()for i = 1, 100 * 10000 dolocal x = math.sin(i) endendTime = os.clock()print("[local] used time " .. (endTime - startTime) * 1000 .. " ms")startTime = os.clock()local sin = math.sin for i = 1, 100 * 10000 dolocal x = sin(i) endendTime = os.clock()print("[local] used time " .. (endTime - startTime) * 1000 .. " ms")

上面二段代碼,唯一的區(qū)別就是使用 local sin 將 math.sin緩存起來(lái)。性能提升約 (107 - 74) / 107 ~= 30.8%,基本符合作者所說(shuō)的30%的效率提升。

?

startTime = os.clock() function foo(x)for i = 1, 100 * 10000 dox = x + math.sin(i)endreturn x endfoo(10)endTime = os.clock()print("[foo] used time " .. (endTime - startTime) * 1000 .. " ms")startTime = os.clock() function foo2(x)local sin = math.sinfor i = 1, 100 * 10000 dox = x + sin(i)endreturn x endfoo2(10)endTime = os.clock()print("[foo2] used time " .. (endTime - startTime) * 1000 .. " ms")

提升的時(shí)間是 (125 – 88) /125 = 29.6%,也約為30%(需要多次測(cè)試取平均值)

?

使用閉包,避免動(dòng)態(tài)編譯。

startTime = os.clock() local lim = 10 * 10000 local a = {} for i = 1, lim doa[i] = loadstring(string.format("return %d", i)) endprint(a[10]())endTime = os.clock()print("used time " .. (endTime - startTime) * 1000 .. " ms")startTime = os.clock() function fk(k)return function() return k end endlocal lim = 10 * 10000 local a = {} for i = 1, lim doa[i] = fk(i) end endTime = os.clock()print("used time " .. (endTime - startTime) * 1000 .. " ms")

節(jié)省了約92%的時(shí)間,差異距大。

?

2) 字符串拼接,盡可能使用 table 替代

startTime = os.clock()local buff = "" for line in io.lines("C:/Users/zhangyi/Desktop/xxx.txt") dobuff = buff .. line .. "\n" endendTime = os.clock()print(collectgarbage("count") * 1024)print("used time " .. (endTime - startTime) * 1000 .. " ms")startTime = os.clock()local buff = "" local tbl = {} for line in io.lines("C:/Users/zhangyi/Desktop/xxx.txt") dotable.insert(tbl, line) endbuff = table.concat(table, "\n")endTime = os.clock()print(collectgarbage("count") * 1024)print("used time " .. (endTime - startTime) * 1000 .. " ms")

差異非常大,無(wú)論是內(nèi)存還是時(shí)間,主要原因是:Lua中字符串的拼接都是新創(chuàng)建一個(gè)新的字符串,有一個(gè)新創(chuàng)建一塊內(nèi)存、copy字符串的動(dòng)作,時(shí)間、空間上消耗都比較大。

?

3) table使用的優(yōu)化

startTime = os.clock() for i = 1, 100 * 10000 dolocal a = {}a[1] = 1a[2] = 2a[3] = 3 end endTime = os.clock()print("used time " .. (endTime - startTime) * 1000 .. " ms")startTime = os.clock() for i = 1, 100 * 10000 dolocal a = {true, true, true}a[1] = 1a[2] = 2a[3] = 3 end endTime = os.clock()print("used time " .. (endTime - startTime) * 1000 .. " ms")

時(shí)間相差一倍,也就是說(shuō)如果不給{}給定初時(shí)化大小,當(dāng)賦值的時(shí)候,它會(huì)申請(qǐng)空間來(lái)存放相應(yīng)的值。

?

?

local polyline= {}for i = 0, 100 * 10000 dotable.insert(polyline, {x = i, y = 1}) endprint(collectgarbage("count") / 1024)

107.57151889801MB

?

local polyline= {}for i = 0, 100 * 10000 dotable.insert(polyline, {i, 1}) endprint(collectgarbage("count") / 1024)

77.053853034973MB

?

local polyline= {x = {},y = {} }for i = 0, 100 * 10000 dotable.insert(polyline.x, i)table.insert(polyline.y, i) endprint(collectgarbage("count") / 1024)

32.019150733948MB

空間占用差距也非常大,從上面似乎可以得到這樣的結(jié)論:盡可能減少table的長(zhǎng)度,盡可能使用array 而不是 hash。

?

綜上所述,盡可能多使用local,減少查詢的性能損耗。json數(shù)據(jù)表如果需要轉(zhuǎn)化為table時(shí),改變數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)可能減少很大的內(nèi)存使用。

總結(jié)

以上是生活随笔為你收集整理的lua的性能优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。