校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Lua性能優化技巧(四):關于字符串

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

熱門標簽:百度地圖標注早餐區域 怎么去除地圖標注 冀州市地圖標注 武漢外呼防封系統多少錢 漳州智云呼電話機器人 新岸線智能電銷機器人 個人怎么在地圖標注需要的店鋪 清朝地圖標注哈爾濱 地圖標注大廈

與表類似,了解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

您可能感興趣的文章:
  • Lua性能優化技巧(一):前言
  • Lua性能優化技巧(二):基本事實
  • Lua性能優化技巧(三):關于表
  • Lua性能優化技巧(五):削減、重用和回收
  • Lua性能優化技巧(六):最后的提示

標簽:天門 天門 臺灣 濰坊 宣城 金昌 德宏 儋州

巨人網絡通訊聲明:本文標題《Lua性能優化技巧(四):關于字符串》,本文關鍵詞  Lua,性能,優化,技巧,四,關于,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua性能優化技巧(四):關于字符串》相關的同類信息!
  • 本頁收集關于Lua性能優化技巧(四):關于字符串的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 沁水县| 浙江省| 桦南县| 渝中区| 石嘴山市| 大厂| 丹棱县| 屏南县| 磐石市| 商河县| 建阳市| 彰化市| 株洲市| 莱西市| 宿松县| 富裕县| 建平县| 文登市| 禹城市| 黑水县| 双鸭山市| 萝北县| 吉木乃县| 惠东县| 托克逊县| 克山县| 松潘县| 洪洞县| 花垣县| 海南省| 光泽县| 绥滨县| 萝北县| 宁强县| 吴堡县| 慈溪市| 临城县| 潍坊市| 仁寿县| 乌兰县| 西林县|