今天看到一個帖子,是關於lua優化的,上面說清空一個表的時候,pairs的效率是next的500倍。
我記得for pairs循環實際上就是調用的就是next,還特意查了源碼,應證了我的記憶。
源碼就不貼了,直接給結論。
for k, v in pairs(tbl) do
end
基本等同於
for k, v in next, tbl, nil do
end
pairs(tbl)返回三個值,稱爲迭代方法(源碼註釋中爲generator)、狀態和初始值。
而實際上這個三個值便是next,tbl和nil。
第一次循環,將tbl和nil傳入next方法,返回k和v(如果是空表,返回nil,中斷循環)。
第二次循環,將tbl和k傳入next方法,返回新的k和v(如果是空表,返回nil,中斷循環)。
……
ipairs與之類似,只不過ipairs返回的迭代方法是一個沒有暴露出來的方法,而初始值是0。
第一次循環,將tbl和i(初始值0)傳入迭代方法,i++,然後用rawgeti獲取第一個值v,返回i和v(如果是空表,直接返回,中斷循環)。
第二次循環,將tbl和i(當前值1)傳入迭代方法,i++,然後用rawgeti獲取第二個值v,返回i和v(如果是空表,直接返回,中斷循環)。
……
因爲帖子沒有給出代碼,我也不敢武斷的就說對方是錯的。但是我認爲,沒有上下文的情況下,對方直接給出pairs比next快很多的結論也是有很大問題的。