Я люблю Lua. I love Lua.

Скорость цикла for

Posted in Uncategorized by ilovelua on Август 8, 2013

В чужом коде увидел такое:

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

То есть «некрасивый» код работает в два раза быстрее «красивого». Вот так.