Lua效能最佳化技巧(四):關於字串_Lua

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.