Lua中使用table.concat連接大量字符串實例
最近2天都沒有寫新的文章了,主要是最近的內(nèi)容沒有特別有意思的。
之前的協(xié)同程序也暫時沒有感覺到特別適用的地方,今天在看數(shù)據(jù)結(jié)構(gòu)的部分,也是沒多大意思(不代表沒用)。
但是突然發(fā)現(xiàn)了一個有意思的地方,那就是——連接大量字符串的時候,如何解決效率問題。
1.預(yù)備知識,在Lua中獲取系統(tǒng)時間
為了直觀地看到效率的差別,我們要計算一下代碼的執(zhí)行時間,所以,先來看看如何計算吧:
local startTime = os.clock();
for i = 1, 1990000000, 1 do
end
local endTime = os.clock();
local useTime = endTime - startTime;
print("消耗時間:" .. useTime .. "s");
輸出結(jié)果如下:
[LUA-print] 消耗時間:0.59699999999998s
os.clock()可以獲得當(dāng)前系統(tǒng)時間(單位:秒),只要在代碼執(zhí)行前后都獲取一次時間,取差值,就能得到代碼執(zhí)行的時間消耗了。
2.Lua中連接大量字符串
我們來試試連接一大堆字符串吧,如下代碼:
local strs = {};
for i = 1, 30000, 1 do
strs[i] = "helloworld";
end
local result = "";
local startTime = os.clock();
for index, str in ipairs(strs) do
result = result .. str;
end
local endTime = os.clock();
local useTime = endTime - startTime;
print("消耗時間:" .. useTime .. "s");
首先,創(chuàng)建了一個strs的table,里面存放30000個字符串,雖然內(nèi)容都是相同的,但確實是有30000個字符串在里面。
然后,使用一個result變量,把strs里的所有字符串用連接操作符連接起來~
咋一看,沒什么問題吧,很正常吖。(小若:別開玩笑了,你會不挖坑給我們踩?)
運行一下,輸出結(jié)果如下:
[LUA-print] 消耗時間:1.667s
才消耗了1.667s,還好吧,完全能接受,呵呵。(小若:快說,別賣關(guān)子!)
啊,怎么可能啊!我們可是閑得X疼的人,怎么可能忍受3萬次循環(huán)就耗去1秒多的時間呢?
你讓那些做算法的人怎么辦,他們肯定無法接受的!
3.使用table.concat快速連接大量字符串
所以了,就有了table.concat,concat函數(shù)對字符串連接進行了優(yōu)化,即使進行大量的連接操作,也不會消耗多少時間。
來試試吧,如下代碼:
local strs = {};
for i = 1, 30000, 1 do
strs[i] = "helloworld";
end
local result = "";
local startTime = os.clock();
result = table.concat(strs);
local endTime = os.clock();
local useTime = endTime - startTime;
print("消耗時間:" .. useTime .. "s");
立刻來看輸出結(jié)果:
[LUA-print] 消耗時間:0.0049999999998818s
怎么樣?這差別,簡直就沒法形容了。
4.結(jié)束
Lua的字符串和Java的字符串差不多,都是不可變的,不可變的意思是什么呢?
比如剛剛的result字符串,每一次進行連接操作之后,其實就產(chǎn)生了新的字符串,不再是原來的那個了。
于是,不斷連接,就不斷產(chǎn)生新的字符串,產(chǎn)生新字符串是需要復(fù)制操作,隨著連接操作的不斷進行著,字符串越來越大,復(fù)制操作也就越來越耗時。
這就是為什么,簡單地進行連接操作會這么慢了。
好了,就說這么多喇~
相關(guān)文章
Lua中的repeat...until循環(huán)語句使用教程
這篇文章主要介紹了Lua中的repeat...until循環(huán)語句使用教程,是Lua入門學(xué)習(xí)中的基礎(chǔ)教程,需要的朋友可以參考下2015-05-05lua讀取redis數(shù)據(jù)的null判斷示例代碼
最近在工作中遇到了一個問題,通過查找相關(guān)資料才得知原因是因為返回結(jié)果的問題,下面這篇文章主要給大家介紹了關(guān)于lua讀取redis數(shù)據(jù)的null判斷的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2018-09-09