最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua性能優(yōu)化技巧(四):關(guān)于字符串

 更新時間:2015年04月21日 08:59:37   投稿:junjie  
這篇文章主要介紹了Lua性能優(yōu)化技巧(四):關(guān)于字符串,本文講解了關(guān)于字符串的一些優(yōu)化技巧,需要的朋友可以參考下

與表類似,了解Lua如何實現(xiàn)字符串可以讓你更高效地使用它。

Lua實現(xiàn)字符串的方式與多數(shù)其他腳本語言所采用的兩種主要方式都不相同。首先,Lua中的所有字符串都是內(nèi)部化[1]的,這意味著Lua維護(hù)著任何字符串的一個單一拷貝。當(dāng)一個新字符串出現(xiàn)時,Lua檢查是否有現(xiàn)成的拷貝,如果有的話,重用之。內(nèi)部化使得諸如字符串對比和索引表之類的操作非常快速,但是會降低創(chuàng)建字符串的速度。

第二,Lua中的變量從不存儲字符串,只是引用它們。這種實現(xiàn)方式可以加快很多字符串操作,例如在Perl中,當(dāng)你寫類似于$x=$y的代碼、$y是一個字符串時,賦值操作會將字符串的內(nèi)容從$y的緩沖區(qū)復(fù)制到$x的緩沖區(qū)。如果這個字符串很長,這個操作的開銷就很大。而在Lua中,這個賦值僅僅是一次指針的復(fù)制。

然而,這種引用實現(xiàn)會降低特定方式的字符串連接的速度。在Perl中,操作$s = $s . "x"和$s .= "x"區(qū)別非常大,對于前者,你獲得了$s的一個拷貝,并且追加"x"到它的尾部;而對于后者,"x"只是簡單地被追加到$s所維護(hù)的內(nèi)部緩沖區(qū)的尾部。因此,后者無關(guān)于字符串的長度(假設(shè)緩沖區(qū)足夠放下追加的文本)。如果把這兩句代碼放進(jìn)循環(huán)里,它們的區(qū)別就是線性和二次算法的區(qū)別。例如,下述循環(huán)需要大約五分鐘來讀取一個5MB的文件:

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

$x = "";
while (<>)
{
    $x = $x . $_;
}

如果我們把
復(fù)制代碼 代碼如下:

$x = $x . $_

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

$x .= $_

耗時將會降低為0.1秒!

Lua沒有提供第二種,也就是更快速的方式,因為它的變量沒有內(nèi)部緩沖區(qū)。因此,我們需要一個顯式的緩沖區(qū):一個包含字符串片段的表來完成這項工作。下面的循環(huán)讀取相同的5MB的文件,需要0.28秒,雖然沒有Perl那么快,也還算不錯:

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

local t = {}
for line in io.lines() do
    t[#t + 1] = line
end
s = table.concat(t, "\n")

[1] 內(nèi)部化,原文internalize

相關(guān)文章

最新評論

鹤岗市| 彰化市| 洛扎县| 黔南| 芜湖县| 大悟县| 平凉市| 清新县| 弥勒县| 乐都县| 内丘县| 阜城县| 民丰县| 合作市| 康保县| 天峻县| 阳西县| 宁都县| 浮山县| 宁远县| 鄄城县| 察隅县| 东兴市| 吉安县| 元谋县| 海安县| 大兴区| 无为县| 宁远县| 甘泉县| 灌南县| 肥西县| 汝城县| 蓬安县| 文昌市| 洛浦县| 凉山| 上虞市| 淮滨县| 颍上县| 开平市|