濮阳杆衣贸易有限公司

主頁 > 知識庫 > Lua中使用table.concat連接大量字符串實(shí)例

Lua中使用table.concat連接大量字符串實(shí)例

熱門標(biāo)簽:上海企業(yè)外呼系統(tǒng)排名 智能語音電銷的機(jī)器人 開通400電話申請流程 武漢百應(yīng)人工智能電銷機(jī)器人 百度地圖標(biāo)注位置網(wǎng)站 400手機(jī)電話免費(fèi)辦理 如何利用高德地圖標(biāo)注家 電腦外呼系統(tǒng)輻射大嗎 揚(yáng)州電銷外呼系統(tǒng)軟件

最近2天都沒有寫新的文章了,主要是最近的內(nèi)容沒有特別有意思的。

之前的協(xié)同程序也暫時(shí)沒有感覺到特別適用的地方,今天在看數(shù)據(jù)結(jié)構(gòu)的部分,也是沒多大意思(不代表沒用)。

但是突然發(fā)現(xiàn)了一個(gè)有意思的地方,那就是——連接大量字符串的時(shí)候,如何解決效率問題。

1.預(yù)備知識,在Lua中獲取系統(tǒng)時(shí)間

為了直觀地看到效率的差別,我們要計(jì)算一下代碼的執(zhí)行時(shí)間,所以,先來看看如何計(jì)算吧:

復(fù)制代碼 代碼如下:

    local startTime = os.clock();
    for i = 1, 1990000000, 1 do
      
    end
  
    local endTime = os.clock();
    local useTime = endTime - startTime;
    print("消耗時(shí)間:" .. useTime .. "s");

輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] 消耗時(shí)間:0.59699999999998s

os.clock()可以獲得當(dāng)前系統(tǒng)時(shí)間(單位:秒),只要在代碼執(zhí)行前后都獲取一次時(shí)間,取差值,就能得到代碼執(zhí)行的時(shí)間消耗了。

2.Lua中連接大量字符串

我們來試試連接一大堆字符串吧,如下代碼:

復(fù)制代碼 代碼如下:

    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("消耗時(shí)間:" .. useTime .. "s");

首先,創(chuàng)建了一個(gè)strs的table,里面存放30000個(gè)字符串,雖然內(nèi)容都是相同的,但確實(shí)是有30000個(gè)字符串在里面。

然后,使用一個(gè)result變量,把strs里的所有字符串用連接操作符連接起來~
 
咋一看,沒什么問題吧,很正常吖。(小若:別開玩笑了,你會(huì)不挖坑給我們踩?)
運(yùn)行一下,輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] 消耗時(shí)間:1.667s

才消耗了1.667s,還好吧,完全能接受,呵呵。(小若:快說,別賣關(guān)子?。?/p>

啊,怎么可能?。∥覀兛墒情e得X疼的人,怎么可能忍受3萬次循環(huán)就耗去1秒多的時(shí)間呢?

你讓那些做算法的人怎么辦,他們肯定無法接受的!

3.使用table.concat快速連接大量字符串

所以了,就有了table.concat,concat函數(shù)對字符串連接進(jìn)行了優(yōu)化,即使進(jìn)行大量的連接操作,也不會(huì)消耗多少時(shí)間。
來試試吧,如下代碼:

復(fù)制代碼 代碼如下:

    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("消耗時(shí)間:" .. useTime .. "s");

立刻來看輸出結(jié)果:

復(fù)制代碼 代碼如下:

[LUA-print] 消耗時(shí)間:0.0049999999998818s

怎么樣?這差別,簡直就沒法形容了。

4.結(jié)束

Lua的字符串和Java的字符串差不多,都是不可變的,不可變的意思是什么呢?

比如剛剛的result字符串,每一次進(jìn)行連接操作之后,其實(shí)就產(chǎn)生了新的字符串,不再是原來的那個(gè)了。

于是,不斷連接,就不斷產(chǎn)生新的字符串,產(chǎn)生新字符串是需要復(fù)制操作,隨著連接操作的不斷進(jìn)行著,字符串越來越大,復(fù)制操作也就越來越耗時(shí)。

這就是為什么,簡單地進(jìn)行連接操作會(huì)這么慢了。
 
好了,就說這么多喇~

您可能感興趣的文章:
  • Lua的table庫函數(shù)insert、remove、concat、sort詳細(xì)介紹
  • Lua中table的幾種構(gòu)造方式詳解
  • Lua中對table排序?qū)嵗?/li>
  • Lua中遍歷數(shù)組和table的4種方法
  • Lua中的table學(xué)習(xí)筆記
  • Lua中的table淺析
  • Lua判斷Table是否為空的方法(空的table即{})
  • Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu)
  • 獲取Lua表結(jié)構(gòu)(table)數(shù)據(jù)實(shí)例
  • 深入談?wù)刲ua中神奇的table

標(biāo)簽:嘉峪關(guān) 新余 張掖 江西 宜賓 黑龍江 武漢 延邊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中使用table.concat連接大量字符串實(shí)例》,本文關(guān)鍵詞  Lua,中,使用,table.concat,連接,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中使用table.concat連接大量字符串實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua中使用table.concat連接大量字符串實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    屏东县| 四川省| 婺源县| 临邑县| 平武县| 昌都县| 临桂县| 吉首市| 滨海县| 玛纳斯县| 得荣县| 无锡市| 大足县| 正阳县| 兴海县| 武山县| 万年县| 微博| 杨浦区| 玛沁县| 定州市| 张家港市| 苍山县| 威宁| 旬邑县| 伊宁县| 蒲江县| 五河县| 扎赉特旗| 宁波市| 彰武县| 鲜城| 德昌县| 页游| 临澧县| 宁城县| 平江县| 碌曲县| 武乡县| 丰城市| 旌德县|