国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Lua性能優化技巧(四):關于字符串

2024-07-21 23:04:30
字體:
來源:轉載
供稿:網友

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

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

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

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

復制代碼 代碼如下:

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

如果我們把
復制代碼 代碼如下:

$x = $x . $_

改為
復制代碼 代碼如下:

$x .= $_

耗時將會降低為0.1秒!

 

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

復制代碼 代碼如下:

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

 

[1] 內部化,原文internalize

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 景洪市| 高安市| 曲周县| 怀集县| 大埔区| 木里| 虎林市| 修武县| 五大连池市| 湘潭县| 双牌县| 松江区| 防城港市| 阿瓦提县| 盐山县| 孟津县| 榕江县| 阳信县| 邳州市| 巴彦县| 松江区| 西吉县| 张北县| 林州市| 临西县| 六安市| 哈巴河县| 保靖县| 峨边| 华宁县| 连云港市| 海丰县| 马尔康县| 丰城市| 连山| 娱乐| 连江县| 隆昌县| 迁安市| 宁安市| 海伦市|