【问题标题】:Should I use ipairs or a for loop我应该使用 ipairs 还是 for 循环
【发布时间】:2012-02-15 19:49:01
【问题描述】:

我听说 ipairs 的使用比 for 循环慢,我应该改变我的编程习惯吗?有一天我会使用 lua 5.2,目前是 5.1。

我的数组最多大约 1000 个项目。

local mytbl = { 'a','b','c','e'}
for i,v in ipairs(mytbl) do
  print(i,v)
end

for i=1,#mytbl do
  print(i,mytbl[i])
end

【问题讨论】:

    标签: lua


    【解决方案1】:

    http://springrts.com/wiki/Lua_Performance#TEST_9:_for-loops

    pairs: 3.078 (217%)
    ipairs: 3.344 (236%)
    for i=1,x do: 1.422 (100%)
    for i=1,#atable do 1.422 (100%)
    for i=1,atable_length do: 1.562 (110%)
    

    但是请注意,使用数字 for 循环仅在您迭代具有顺序数字索引的表时才有效 - 如果您为表或稀疏表使用哈希键,那么您需要使用某种形式的pairs()

    【讨论】:

    • 感谢性能表。就几个循环而言,双倍时间实际上并不多,所以我不太需要更改我当前的代码。但是对于未来的循环,我现在知道我需要做什么。谢谢!
    • 与所有性能考虑一样,这完全取决于上下文。过早的优化是万恶之源。
    • 你的评论应该是:"那么你需要使用pairs()"只有两种“配对形式”:pairsipairs。后者完全等同于 for 循环:它通过将数字索引从 1 递增到 #t 来进行迭代。由于 for 循环不起作用,它在您的示例案例中不起作用。
    • @Mud 实际上ipairs(t) 和从1#t 的数字for 循环 等效。前者迭代数字键和值,直到找到 nil 值。后者遍历从1 到表的长度的所有数字键,就像它在迭代开始时一样。如果t在迭代过程中没有变化并且t没有空洞,那么这两个循环是等价的(除非涉及到__len__ipairs元方法)。
    • 我错误地称它们为完全等效。但是,它们在“仅在迭代具有顺序数字索引的表时才有效”方面是等价的,这就是我所说的。
    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 2018-03-22
    • 2014-04-27
    • 2014-04-27
    • 2021-02-03
    • 2011-01-11
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多