Скорость цикла for
В чужом коде увидел такое:
for i = 1, #data.values do local value = data.values[i] ... end
И тут же осудил внутри себя этого нерадивого разработчика «Экий ты, брат, ленивец! Нет бы написать «правильно»!»:
for i, value in ipairs(data.values) do ... end
И тут меня сомнение взяло: второй вариант мне лично кажется красивее и правильнее, но быстр ли он? И быстро был написан тест:
local data = { values = {} } for i = 1, 10000 do table.insert(data.values, i) end local function simpleForTest() local j local t = os.clock() for k = 1, 100 do for i = 1, #data.values do j = data.values[i] end end print('~~~#', os.clock() - t) end local function ipairsTest() local j local t = os.clock() for k = 1, 100 do for i, val in ipairs(data.values) do j = val end end print('~~~ipairs', os.clock() - t) end for i = 1, 10 do simpleForTest() ipairsTest() end
А результаты он давал такие:
~~~# 0.063
~~~ipairs 0.121
~~~# 0.063
~~~ipairs 0.122
~~~# 0.063
~~~ipairs 0.122
~~~# 0.062
~~~ipairs 0.121
~~~# 0.063
~~~ipairs 0.122
~~~# 0.063
~~~ipairs 0.122
~~~# 0.063
~~~ipairs 0.122
~~~# 0.062
~~~ipairs 0.122
~~~# 0.063
~~~ipairs 0.122
~~~# 0.063
~~~ipairs 0.122
То есть «некрасивый» код работает в два раза быстрее «красивого». Вот так.
2 комментария