Информация pairs() vs #

Статус
В этой теме нельзя размещать новые ответы.

Laine_prikol

ДИДЖЕЙ МАДЕСТ
Автор темы
Проверенный
260
216
Итак, много раз читал исходники разных людей, и многие из них используют функцию-итератор pairs() или ipairs(). Меньшее количество используют конструкцию for i = 1, #tableName do. Ну и меня так осинило проверить, что же быстрее читает элементы 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
Данный код прогонит 10 раз 2 теста (1. pairs() 2. #)
Тест был проведён на чистом 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() нужен для других целей, он создаёт функцию-итератор, и перебирает значения с таблицы до первого обрыва, также получает ключ/значение. Но если у вас задача просто перебрать все элементы таблицы то есть более быстрый способ с #
 
Последнее редактирование:
  • Нравится
Реакции: imring

LUCHARE

Известный
Друг
545
688
функция pairs() возвращает функцию next() в key, а не числовой индекс
 

ufdhbi

Известный
Проверенный
1,455
861
А если надо перебрать таблицу с подтаблицей?
 

SR_team

like pancake
BH Team
4,720
6,369
время в чем измеряется? Секунды? Микросекунды? Миллисекунды? Наносекунды? Пикосекунды? Минуты? Часы? Дни? Недели? Месяцы? Годы? Века?
 
  • Нравится
  • Вау
Реакции: Shepi, eiuhuth и CAPTA!N

FYP

Известный
Администратор
1,758
5,722
функцию pairs неправильно использовать для итерации по массивам, она предназначена для перебора пар ключ:значение, а для итерации по массивам (т.е. индекс:значение) используется ipairs, которая так же быстра, как и обычный цикл.

Код:
# elapsed time: 0.007
pairs() elapsed time: 0.054
ipairs() elapsed time: 0.009

# elapsed time: 0.008
pairs() elapsed time: 0.051
ipairs() elapsed time: 0.008

# elapsed time: 0.008
pairs() elapsed time: 0.053
ipairs() elapsed time: 0.008

# elapsed time: 0.007
pairs() elapsed time: 0.052
ipairs() elapsed time: 0.008

# elapsed time: 0.008
pairs() elapsed time: 0.052
ipairs() elapsed time: 0.008

# elapsed time: 0.007
pairs() elapsed time: 0.052
ipairs() elapsed time: 0.008

# elapsed time: 0.007
pairs() elapsed time: 0.052
ipairs() elapsed time: 0.008

# elapsed time: 0.007
pairs() elapsed time: 0.051
ipairs() elapsed time: 0.009

# elapsed time: 0.007
pairs() elapsed time: 0.053
ipairs() elapsed time: 0.008

# elapsed time: 0.008
pairs() elapsed time: 0.051
ipairs() elapsed time: 0.008
Lua:
data = {}
for i = 1, 10000000 do
    table.insert(data, i)
end
function sampleTest()
    local x = os.clock()
    for i = 1, #data do
       local parse2 = data[i]
    end
    local time = os.clock() - x
    print(string.format("# elapsed time: %.3f", time))
end
function sampleTest2()
    local x = os.clock()
    for key, value in pairs(data) do
        local parse = value
    end
    local time = os.clock() - x
    print(string.format("pairs() elapsed time: %.3f", time))
end
function sampleTest3()
    local x = os.clock()
    for i, value in ipairs(data) do
        local parse = value
    end
    local time = os.clock() - x
    print(string.format("ipairs() elapsed time: %.3f", time))
end
for i = 1, 10 do
    sampleTest()
    sampleTest2()
    sampleTest3()
    print()
end
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.