Lua pairs与ipairs效率分析
介于大家目前有些人比較關(guān)心 lua table中pairs 和 ipairs的效率問題, 特此研究了一下... 如有不正 還需指出..?
首先來看下 lua中table的結(jié)構(gòu)定義:
table中分為2個存儲空間, 一個是線性數(shù)組空間(TValue *array), 和一個hash空間(Node *node)
當(dāng)我們使用 pairs 和 ipairs 會產(chǎn)生兩種不同的迭代器, 一個僅僅遍歷數(shù)組, 一個遍歷所有的值
?
?
?
所以, 當(dāng)調(diào)用ipairs的時候, 在線性數(shù)組中遇到第一個nil時便停止遍歷, 不管后面還是否有值, 這點在遍歷的時候要格外注意
而pairs的迭代器會調(diào)用lua_next, lua_next的實現(xiàn):
這個函數(shù)會根據(jù)top信息調(diào)用luaH_next獲取當(dāng)前table中的下一組鍵值, 那么關(guān)鍵就在luaH_next中, 來看看這個函數(shù)的實現(xiàn):
我們粗略的可以看到, 這個函數(shù)會先計算索引位置, 并根據(jù)該位置優(yōu)先從線性數(shù)組中查找, 如果沒有找到, 再從hash表中查找, 所以如果用pairs遍歷array, 實則和ipairs等效, 并無差異.
所以, 由上面的分析, 如果我們明確table中的數(shù)據(jù)全部存放在線性數(shù)組中, 調(diào)用ipairs或者pairs均可, 并無太大差異(注意ipairs時中間不要出現(xiàn)nil值, 否則會導(dǎo)致遍歷中斷), 如果我們明確遍歷hash表中的值, 則使用pairs, 其效率會較遍歷array中的差
簡單測試 遍歷500 000 000個array or hash value的效率:
?
由于使用了os.time() , 只能獲取到秒級時間, 故精確度不算太高...
?
轉(zhuǎn)載自:https://blog.csdn.net/tony7758/article/details/6334001
總結(jié)
以上是生活随笔為你收集整理的Lua pairs与ipairs效率分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle中的触发器
- 下一篇: 梯度弥散