欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年09月13日 11:31:25   作者:笨木頭  
這篇文章主要介紹了Lua中使用table.concat連接大量字符串實(shí)例,本文是Lua處理大量字符串的一個(gè)測(cè)試文章,測(cè)試了2種方法處理大量字符串的消耗時(shí)間,需要的朋友可以參考下

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

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

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

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

為了直觀(guān)地看到效率的差別,我們要計(jì)算一下代碼的執(zhí)行時(shí)間,所以,先來(lái)看看如何計(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中連接大量字符串

我們來(lái)試試連接一大堆字符串吧,如下代碼:

復(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里的所有字符串用連接操作符連接起來(lái)~
 
咋一看,沒(méi)什么問(wèn)題吧,很正常吖。(小若:別開(kāi)玩笑了,你會(huì)不挖坑給我們踩?)
運(yùn)行一下,輸出結(jié)果如下:

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

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

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

啊,怎么可能??!我們可是閑得X疼的人,怎么可能忍受3萬(wàn)次循環(huán)就耗去1秒多的時(shí)間呢?

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

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

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

復(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");

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

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

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

怎么樣?這差別,簡(jiǎn)直就沒(méi)法形容了。

4.結(jié)束

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

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

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

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

相關(guān)文章

  • Lua教程(二):基礎(chǔ)知識(shí)、類(lèi)型與值介紹

    Lua教程(二):基礎(chǔ)知識(shí)、類(lèi)型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識(shí)、類(lèi)型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類(lèi)型與值等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua中字符串(string)淺析

    Lua中字符串(string)淺析

    這篇文章主要介紹了Lua中字符串(string)淺析,本文講解了字符串的聲明、連接、簡(jiǎn)單的使用方法等,是一篇入門(mén)教程,需要的朋友可以參考下
    2014-09-09
  • Lua中的元表與元方法學(xué)習(xí)總結(jié)

    Lua中的元表與元方法學(xué)習(xí)總結(jié)

    這篇文章主要介紹了Lua中的元表與元方法學(xué)習(xí)總結(jié),本文講解了算術(shù)類(lèi)的元方法、__tostring元方法等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua教程(一):Lua腳本語(yǔ)言介紹

    Lua教程(一):Lua腳本語(yǔ)言介紹

    這篇文章主要介紹了Lua教程(一):Lua腳本語(yǔ)言介紹,需要的朋友可以參考下
    2015-03-03
  • Lua腳本語(yǔ)言概述

    Lua腳本語(yǔ)言概述

    這篇文章主要介紹了Lua腳本語(yǔ)言概述,本文講解了Lua是什么、Lua語(yǔ)言的特性、Lua的使用范圍、Lua的基本內(nèi)容、Lua虛擬機(jī)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中的repeat...until循環(huán)語(yǔ)句使用教程

    Lua中的repeat...until循環(huán)語(yǔ)句使用教程

    這篇文章主要介紹了Lua中的repeat...until循環(huán)語(yǔ)句使用教程,是Lua入門(mén)學(xué)習(xí)中的基礎(chǔ)教程,需要的朋友可以參考下
    2015-05-05
  • Lua中if語(yǔ)句嵌套的使用教程

    Lua中if語(yǔ)句嵌套的使用教程

    這篇文章主要介紹了Lua中if語(yǔ)句嵌套的使用教程,是Lua入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Redis教程(五):Set數(shù)據(jù)類(lèi)型

    Redis教程(五):Set數(shù)據(jù)類(lèi)型

    這篇文章主要介紹了Redis教程(五):Set數(shù)據(jù)類(lèi)型,本文講解了Set數(shù)據(jù)類(lèi)型概述、相關(guān)命令、命令使用示例、應(yīng)用范圍等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua教程(十五):輸入輸出庫(kù)(I/O庫(kù))

    Lua教程(十五):輸入輸出庫(kù)(I/O庫(kù))

    這篇文章主要介紹了Lua教程(十五):輸入輸出庫(kù),本文講解了簡(jiǎn)單模型、完整I/O模型、性能小技巧、其它文件操作等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • lua讀取redis數(shù)據(jù)的null判斷示例代碼

    lua讀取redis數(shù)據(jù)的null判斷示例代碼

    最近在工作中遇到了一個(gè)問(wèn)題,通過(guò)查找相關(guān)資料才得知原因是因?yàn)榉祷亟Y(jié)果的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于lua讀取redis數(shù)據(jù)的null判斷的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09

最新評(píng)論