Lua pairs與ipairs效率分析

介於大家目前有些人比較關心 lua table中pairs 和 ipairs的效率問題, 特此研究了一下... 如有不正 還需指出.. 

首先來看下 lua中table的結構定義:




table中分爲2個存儲空間, 一個是線性數組空間(TValue *array), 和一個hash空間(Node *node)

當我們使用 pairs 和 ipairs 會產生兩種不同的迭代器, 一個僅僅遍歷數組, 一個遍歷所有的值

 





所以, 當調用ipairs的時候, 在線性數組中遇到第一個nil時便停止遍歷, 不管後面還是否有值, 這點在遍歷的時候要格外注意

而pairs的迭代器會調用lua_next, lua_next的實現:




這個函數會根據top信息調用luaH_next獲取當前table中的下一組鍵值, 那麼關鍵就在luaH_next中, 來看看這個函數的實現:



我們粗略的可以看到, 這個函數會先計算索引位置, 並根據該位置優先從線性數組中查找, 如果沒有找到, 再從hash表中查找, 所以如果用pairs遍歷array, 實則和ipairs等效, 並無差異.

所以, 由上面的分析, 如果我們明確table中的數據全部存放在線性數組中, 調用ipairs或者pairs均可, 並無太大差異(注意ipairs時中間不要出現nil值, 否則會導致遍歷中斷), 如果我們明確遍歷hash表中的值, 則使用pairs, 其效率會較遍歷array中的差

付個簡單測試 遍歷10000000個array or hash value的效率:



由於使用了os.time() , 只能獲取到秒級時間, 故精確度不算太高...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章