ipairs
включает вызов функции.Это замедляет общий цикл for.Если внутренняя задача является чем-то сложным, издержки вызова функции будут незначительными, по сравнению с несколькими арифметическими операциями это может быть заметно в некоторых крайних случаях.Попробуйте:
a={}
for i=1,2e8 do a[i]=math.random() end
t=os.time()
q=1
for i=1,#a do q=q*a[i] end
print(os.time()-t)
w=1
t=os.time()
for i,v in ipairs(a) do w=w*v end
print(os.time()-t)
Для меня результаты были 15
и 18
.Это более эффективно, когда вычисления повторяются несколько раз (вложенные циклы):
a={} for i=1,1e4 do a[i]=math.random() end
t=os.time() q=1; for i=1,1e5 do for j=1,1e4 do q=q*a[j] end end print(os.time()-t)
t=os.time() q=1; for i=1,1e5 do for _,v in ipairs(a) do q=q*v end end print(os.time()-t)
Но все же не так много.
Если вам действительно нужно выжать даже этот бит производительности,вам, вероятно, стоит взглянуть на luajit и различные числовые рамки на его основе: 1 , 2 , 3 .Также есть статья по оптимизации автора языка.