- 260
- 218
Итак, много раз читал исходники разных людей, и многие из них используют функцию-итератор pairs() или ipairs(). Меньшее количество используют конструкцию for i = 1, #tableName do. Ну и меня так осинило проверить, что же быстрее читает элементы pairs() или #? И почему почти никогда не используют #.
Для тестов напишем вот такой код:
Данный код прогонит 10 раз 2 теста (1. pairs() 2. #)
Тест был проведён на чистом Lua 5.1 win32 (Время в секундах)
И результатом был удивлён, конструкция # работает почти в 2 раза быстрее!
# elapsed time: 0.44
pairs() elapsed time: 0.65
Даже не надо было запускать тест 10 раз, результат отличался на 0.01 мс и то это скорее всего погрешность
Конечно минус у # тоже есть, не очень красиво выглядит код. Также pairs() нужен для других целей, он создаёт функцию-итератор, и перебирает значения с таблицы до первого обрыва, также получает ключ/значение. Но если у вас задача просто перебрать все элементы таблицы то есть более быстрый способ с #
Для тестов напишем вот такой код:
Lua:
data = {}
for i = 1, 10000000 do
table.insert(data, i)
end
function sampleTest()
local x = os.clock()
local s = 0
for i = 1, #data do
local parse2 = data[i]
end
print(string.format("# elapsed time: %.2f\n", os.clock() - x))
end
function sampleTest2()
local x = os.clock()
local s = 0
for key, value in pairs(data) do
local parse = value
end
print(string.format("pairs() elapsed time: %.2f\n", os.clock() - x))
end
for i = 1, 10 do
sampleTest()
sampleTest2()
end
Тест был проведён на чистом Lua 5.1 win32 (Время в секундах)
И результатом был удивлён, конструкция # работает почти в 2 раза быстрее!
# elapsed time: 0.44
pairs() elapsed time: 0.65
Даже не надо было запускать тест 10 раз, результат отличался на 0.01 мс и то это скорее всего погрешность
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.45
pairs() elapsed time: 0.65
# elapsed time: 0.46
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.47
pairs() elapsed time: 0.65
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.45
pairs() elapsed time: 0.65
# elapsed time: 0.46
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.44
pairs() elapsed time: 0.65
# elapsed time: 0.47
pairs() elapsed time: 0.65
Последнее редактирование: