Более быстрый перебор ключ - значение в таблице

Страницы: 1
RSS
Более быстрый перебор ключ - значение в таблице
 
Сейчас обнаружил, что перебор в форме
Код
 for key, val in next, t do
  local k = key
  local v=val
 end
Работает ~ на 10% быстрее, чем в распространённой форме
Код
 for key, val in pairs(t) do
  local k = key
  local v=val
 end
 
Прверял на таблице из 10-ти элементов. Если элементов будет больше, думаю, выигрыш во времени будет меньше.
 
Т.к. экономия происходит за счёт вызова функции pairs, которая в цикле вызывается лишь 1 раз.
 
Не думаю, что будут заметный эффект. Результат выполнения функции pairs есть функция next и t. Т.е. это просто синтаксический сахар, и это описано в книге по языку.
Минус один вызов, да.
 
Опять микросекунды ловим... посмотрел сейчас свой скрипт: там 8 циклов while, 38 циклов for, и только ДВА из них записаны НЕ в виде "for i=k,n do...". Один с отрицательным шагом (там нужно пробежаться по таймфреймам именно от тяжёлых к лёгким) и ещё один "for l in F:lines() do..." заглатывает строки из файла данных при запуске скрипта. Все ключи всех массивов - натуральные числа, иногда с нулём, и сделано это вовсе не для какого-то несчастного быстродействия, а так, на всякий случай, чтобы не искать на свою жопу приключений - считать ключи индексами надёжнее, так меньше шансов нарваться на какой-то хитрый глюк.
 
А вот так:

for k=1,#t do
 local v=t[k]
end

))
 
Цитата
Kolossi написал:
А вот так:

for k=1,#t do
 local v=t[k]
end

))
Для массивов так, конечно, быстрее.
pairs применяют для хеш таблиц, где простой итератор не применить.
 
Цитата
Nikolay написал:
Для массивов так, конечно, быстрее.
pairs применяют для хеш таблиц, где простой итератор не применить.
Я конечно пошутил, но все же полагаю что если (по возможности) использовать массив вместо хэш-таблицы то перебор будет быстрее.
Во всяком случае такие выводы у меня получились при сравнении обработки таблицы обезличенных сделок с приличным объемом.
in pairs проигрывает построчному перебору.
 
Вот загадочное и интересное сообщение: https://forum.quik.ru/messages/forum10/message34083/topic3921/#message34083
См. также typedef struct Table в https://www.lua.org/source/5.1/lobject.h.html
Можно ли как-то получить адрес этой структуры таблицы в программе на Lua и C, чтобы, скажем, напрямую читать
TValue *array;  /* array part */ ?
Т.е. в случае C минуя rawgeti и стек Lua?
 
Старый lobject.h попался, вот для Lua 5.4:
https://www.lua.org/source/5.4/lobject.h.html
 
Цитата
Цитата
Serge123 написал:
Вот загадочное и интересное сообщение:  https://forum.quik.ru/messages/forum10/message34083/topic3921/#message34083
См. также typedef struct Table в  https://www.lua.org/source/5.1/lobject.h.html
Можно ли как-то получить адрес этой структуры таблицы в программе на Lua и C, чтобы, скажем, напрямую читать
TValue  *array;  /* array part */ ?
Т.е. в случае C минуя rawgeti и стек Lua?
Можно.  Делал это на 5.3.
Страницы: 1
Читают тему
Наверх