婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Lua性能優化技巧(三):關于表

Lua性能優化技巧(三):關于表

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

一般情況下,你不需要知道Lua實現表的細節,就可以使用它。實際上,Lua花了很多功夫來隱藏內部的實現細節。但是,實現細節揭示了表操作的性能開銷情況。因此,要優化使用表的程序(這里特指Lua程序),了解一些表的實現細節是很有好處的。

Lua的表的實現使用了一些很聰明的算法。每個Lua表的內部包含兩個部分:數組部分和哈希部分。數組部分以從1到一個特定的n之間的整數作為鍵來保存元素(我們稍后即將討論這個n是如何計算出來的)。所有其他元素(包括在上述范圍之外的整數鍵)都被存放在哈希部分里。

正如其名,哈希部分使用哈希算法來保存和查找鍵。它使用被稱為開放地址表的實現方式,意思是說所有的元素都保存在哈希數組中。用一個哈希函數來獲取一個鍵對應的索引;如果存在沖突的話(意即,如果兩個鍵產生了同一個哈希值),這些鍵將會被放入一個鏈表,其中每個元素對應一個數組項。當Lua需要向表中添加一個新的鍵,但哈希數組已滿時,Lua將會重新哈希。重新哈希的第一步是決定新的數組部分和哈希部分的大小。因此,Lua遍歷所有的元素,計數并對其進行歸類,然后為數組部分選擇一個大小,這個大小相當于能使數組部分超過一半的空間都被填滿的2的最大的冪;然后為哈希部分選擇一個大小,相當于正好能容納哈希部分所有元素的2的最小的冪。

當Lua創建空表時,兩個部分的大小都是0。因此,沒有為其分配數組。讓我們看一看當執行下面的代碼時會發生什么:

復制代碼 代碼如下:

local a = {}
for i = 1, 3 do
    a[i] = true
end

這段代碼始于創建一個空表。在循環的第一次迭代中,賦值語句
復制代碼 代碼如下:

a[1] = true

觸發了一次重新哈希;Lua將數組部分的大小設為1,哈希部分依然為空;第二次迭代時
復制代碼 代碼如下:

a[2] = true

觸發了另一次重新哈希,將數組部分擴大為2.最終,第三次迭代又觸發了一次重新哈希,將數組部分的大小擴大為4。

類似下面的代碼

復制代碼 代碼如下:

a = {}
a.x = 1; a.y = 2; a.z = 3

做的事情類似,只不過增加的是哈希部分的大小。

對于大的表來說,初期的幾次重新哈希的開銷被分攤到整個表的創建過程中,一個包含三個元素的表需要三次重新哈希,而一個有一百萬個元素的表也只需要二十次。但是當創建幾千個小表的時候,重新哈希帶來的性能影響就會非常顯著。

舊版的Lua在創建空表時會預選分配大小(4,如果我沒有記錯的話),以防止在初始化小表時產生的這些開銷。但是這樣的實現方式會浪費內存。例如,如果你要創建數百萬個點(表現為包含兩個元素的表),每個都使用了兩倍于實際所需的內存,就會付出高昂的代價。這也是為什么Lua不再為新表預分配數組。

如果你使用C編程,可以通過Lua的API函數lua_createtable來避免重新哈希;除lua_State之外,它還接受兩個參數:數組部分的初始大小和哈希部分的初始大小[1]。只要指定適當的值,就可以避免初始化時的重新哈希。需要警惕的是,Lua只會在重新哈希時收縮表的大小,因此如果在初始化時指定了過大的值,Lua可能永遠不會糾正你浪費的內存空間。

當使用Lua編程時,你可能可以使用構造式來避免初始化時的重新哈希。當你寫下

復制代碼 代碼如下:

{true, true, true}

時,Lua知道這個表的數組部分將會有三個元素,因此會創建相應大小的數組。類似的,如果你寫下
復制代碼 代碼如下:

{x = 1, y = 2, z = 3}

Lua也會為哈希部分創建一個大小為4的數組。例如,執行下面的代碼需要2.0秒:
復制代碼 代碼如下:

for i = 1, 1000000 do
    local a = {}
    a[1] = 1; a[2] = 2; a[3] = 3
end

如果在創建表時給定正確的大小,執行時間可以縮減到0.7秒:
復制代碼 代碼如下:

for i = 1, 1000000 do
    local a = {true, true, true}
    a[1] = 1; a[2] = 2; a[3] = 3
end

但是,如果你寫類似于
復制代碼 代碼如下:

{[1] = true, [2] = true, [3] = true}

的代碼,Lua還不夠聰明,無法識別表達式(在本例中是數值字面量)指定的數組索引,因此它會為哈希部分創建一個大小為4的數組,浪費內存和CPU時間。

兩個部分的大小只會在Lua重新哈希時重新計算,重新哈希則只會發生在表完全填滿后,Lua需要插入新的元素之時。因此,如果你遍歷一個表并清除其所有項(也就是全部設為nil),表的大小不會縮小。但是此時,如果你需要插入新的元素,表的大小將會被調整。多數情況下這都不會成為問題,但是,不要指望能通過清除表項來回收內存:最好是直接把表自身清除掉。

一個可以強制重新哈希的猥瑣方法是向表中插入足夠多的nil。例如:

復制代碼 代碼如下:

a = {}
lim = 10000000
for i = 1, lim do a[i] = i end              -- 創建一個巨表
print(collectgarbage("count"))              --> 196626
for i = 1, lim do a[i] = nil end            -- 清除所有元素
print(collectgarbage("count"))              --> 196626
for i = lim + 1, 2 * lim do a[i] = nil end -- 創建一堆nil元素
print(collectgarbage("count"))              --> 17

除非是在特殊情況下,我不推薦使用這個伎倆:它很慢,并且沒有簡單的方法能知道要插入多少nil才夠。

你可能會好奇Lua為什么不會在清除表項時收縮表。首先是為了避免測試寫入表中的內容。如果在賦值時檢查值是否為nil,將會拖慢所有的賦值操作。第二,也是最重要的,允許在遍歷表時將表項賦值為nil。例如下面的循環:

復制代碼 代碼如下:

for k, v in pairs(t) do
    if some_property(v) then
        t[k] = nil – 清除元素
    end
end

如果Lua在每次nil賦值后重新哈希這張表,循環就會被破壞。

如果你想要清除一個表中的所有元素,只需要簡單地遍歷它:

復制代碼 代碼如下:

for k in pairs(t) do
    t[k] = nil
end

一個“聰明”的替代解決方案:
復制代碼 代碼如下:

while true do
    local k = next(t)
    if not k then break end
    t[k] = nil
end

但是,對于大表來說,這個循環將會非常慢。調用函數next時,如果沒有給定前一個鍵,將會返回表的第一個元素(以某種隨機的順序)。在此例中,next將會遍歷這個表,從開始尋找一個非nil元素。由于循環總是將找到的第一個元素置為nil,因此next函數將會花費越來越長的時間來尋找第一個非nil元素。這樣的結果是,這個“聰明”的循環需要20秒來清除一個有100,000個元素的表,而使用pairs實現的循環則只需要0.04秒。

[1] 盡管重新哈希算法始終設置數組的大小為2的冪,數組的大小依然可以為任何自然數值。而哈希的大小必須為2的冪,所以第二個參數總是會被圓整為不小于原值的最小的2的冪。

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

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

巨人網絡通訊聲明:本文標題《Lua性能優化技巧(三):關于表》,本文關鍵詞  Lua,性能,優化,技巧,三,關于,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua性能優化技巧(三):關于表》相關的同類信息!
  • 本頁收集關于Lua性能優化技巧(三):關于表的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美成人猛片aaaaaaa| 国产精品美女一区二区在线观看| 欧美一激情一区二区三区| 亚洲私人黄色宅男| 大桥未久av一区二区三区中文| 欧美性一区二区| 日韩美女视频一区二区| aa级大片欧美| 日韩有码一区二区三区| 精品福利一区二区三区| 国产在线视频一区二区三区| 欧美日韩专区在线| 伊人一区二区三区| 日本国产一区二区| 亚洲午夜视频在线| 欧美三级蜜桃2在线观看| 亚洲视频中文字幕| 欧美肥胖老妇做爰| 国产不卡视频在线观看| 中文字幕日韩一区| 欧美精品在欧美一区二区少妇| 美女脱光内衣内裤视频久久网站| 国产免费观看久久| 欧美三级乱人伦电影| 狠狠色综合播放一区二区| 中文字幕在线观看一区二区| 欧美日韩视频一区二区| 国产精品一二三在| 亚洲福利一区二区三区| 中文字幕第一区| 欧美视频一区二区三区在线观看| 久久精品99久久久| 亚洲不卡在线观看| 国产精品无圣光一区二区| 欧美日本免费一区二区三区| 成人午夜碰碰视频| 日本大胆欧美人术艺术动态| 亚洲国产精华液网站w| 777奇米成人网| 色域天天综合网| 国产成人精品亚洲777人妖| 日本亚洲三级在线| 一区二区三区日韩欧美| 国产精品拍天天在线| 欧美成人综合网站| 欧美精品久久99| 91日韩一区二区三区| 成人午夜视频免费看| 精品一区二区精品| 免费成人在线网站| 日韩av高清在线观看| 亚洲一区影音先锋| 亚洲色欲色欲www在线观看| 国产午夜亚洲精品理论片色戒| 欧美三级电影在线观看| 欧美特级限制片免费在线观看| 成人白浆超碰人人人人| 高清不卡在线观看av| 国产在线视频一区二区三区| 极品美女销魂一区二区三区 | 一区二区三区日韩精品| 国产精品美女久久久久久久久久久 | 狠狠色狠狠色综合| 国产精品一区不卡| 日韩激情一区二区| 日韩电影在线一区二区三区| 日本欧美一区二区三区| 麻豆91精品视频| 韩国av一区二区三区在线观看| 蜜臀av亚洲一区中文字幕| 蜜桃久久精品一区二区| 国内精品伊人久久久久av影院 | 午夜精品久久久久久久久久久| 亚洲婷婷综合色高清在线| 国产精品毛片久久久久久| 国产精品沙发午睡系列990531| 国产清纯在线一区二区www| 中文字幕一区二区三区在线播放| 亚洲精品你懂的| 日韩精品电影在线观看| 奇米色一区二区| 岛国精品在线播放| 欧美羞羞免费网站| 日韩一级高清毛片| 中文乱码免费一区二区| 亚洲成在线观看| 国产一区三区三区| 91视频观看免费| 欧美一区二区三区不卡| 欧美激情资源网| 日日夜夜一区二区| 国产成人在线免费| 在线观看日韩一区| 欧美一区二区三区免费观看视频 | 日韩欧美国产一二三区| 国产三级精品三级| 亚洲一区二区三区三| 人人超碰91尤物精品国产| 丁香网亚洲国际| 91精品国产福利在线观看| 久久久三级国产网站| 亚洲国产一区二区在线播放| 韩国女主播一区二区三区| a在线播放不卡| 精品欧美黑人一区二区三区| 亚洲女同一区二区| 国产激情精品久久久第一区二区 | 欧美性猛交xxxx黑人交| 国产亚洲综合av| 天天影视网天天综合色在线播放 | 欧美亚洲动漫精品| 亚洲国产精品二十页| 天天爽夜夜爽夜夜爽精品视频| 高清shemale亚洲人妖| 这里只有精品视频在线观看| 国产精品久久久久婷婷二区次| 日本网站在线观看一区二区三区| 国产91精品欧美| 精品精品欲导航| 天天亚洲美女在线视频| 欧美视频精品在线观看| 久久精品人人做人人爽97| 亚洲成av人片在www色猫咪| 97久久精品人人做人人爽50路| 久久久99精品久久| 男女男精品视频| 欧美男男青年gay1069videost| 中文字幕中文字幕一区二区| 国产高清无密码一区二区三区| 3751色影院一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 91精品福利视频| 亚洲激情一二三区| 欧美少妇bbb| 亚洲国产欧美一区二区三区丁香婷| 成人免费不卡视频| 国产精品国产三级国产a| 不卡的av在线| 亚洲免费伊人电影| 在线观看一区日韩| 亚洲第一av色| 欧美一区二区三区免费观看视频 | 在线不卡中文字幕播放| 亚洲成人精品一区| 91精品国产品国语在线不卡| 奇米精品一区二区三区在线观看 | 亚洲精品视频免费观看| 日本久久电影网| 亚洲国产日韩在线一区模特| 欧美精品在线一区二区| 麻豆91精品91久久久的内涵| 久久久久一区二区三区四区| 国产宾馆实践打屁股91| 一区二区三区不卡视频| 欧美一区二区三区成人| 国产在线精品不卡| 中文字幕国产一区二区| 日本伦理一区二区| 日本va欧美va瓶| 国产亚洲va综合人人澡精品 | 美脚の诱脚舐め脚责91| 久久久青草青青国产亚洲免观| 成人高清在线视频| 亚洲国产欧美在线人成| 精品嫩草影院久久| 成人午夜私人影院| 亚洲五月六月丁香激情| 精品国产乱码久久久久久1区2区 | 国产伦理精品不卡| 中文字幕亚洲精品在线观看| 欧美乱熟臀69xxxxxx| 国产乱子伦视频一区二区三区| 自拍偷拍亚洲欧美日韩| 91精品国产全国免费观看| 国产成人99久久亚洲综合精品| 亚洲一区二区三区四区在线免费观看 | 亚洲午夜精品久久久久久久久| 欧美精品一区二| 在线亚洲欧美专区二区| 蓝色福利精品导航| 夜夜嗨av一区二区三区中文字幕| 欧美videos中文字幕| 91在线视频在线| 国产一区二区三区四| 亚洲123区在线观看| 中文字幕在线一区| 久久色视频免费观看| 欧美日韩一区二区在线观看| 成人18视频在线播放| 国产麻豆精品一区二区| 七七婷婷婷婷精品国产| 亚洲视频免费在线| 中文欧美字幕免费| 国产日韩精品一区二区三区在线| 6080日韩午夜伦伦午夜伦| 日本韩国一区二区三区视频| 97久久精品人人做人人爽| 粉嫩绯色av一区二区在线观看| 久久99热99| 久久er精品视频|