Использование локальных переменных в Lua
Локальные переменные в языке Lua являются очень быстрыми, поскольку они находятся в виртуальном регистрах машины и доступны по индексу. Глобальные переменные, напротив, находятся в таблице глобальных переменных Lua и доступны лишь хешированием.
Поэтому везде, где требуется интенсивный доступ к переменным, следует использовать переменные с локальной видимостью взамен глобальных. Особенно это актуально для переменных, обращение к которым происходит в циклах.
По умолчанию все переменные в Lua глобальны. Чтобы сделать переменную локальной, она должна быть явно описана как local.
Вот фрагмент кода, который в том или ином варианте встречается в каждой программе на lua:
local i, v = next(t, nil) while i do i, v = next(t, i) end
Чтобы сэкономить порядка 10% процессорного времени, необходимого для выполнения этого фрагмента, имеет смысл заменить глобальный итератор next() на его локальную копию:
local next = next local i, v = next(t, nil) while i do i, v = next(t, i) end
Похожая ситуация с require. Имеет смысл присвоить локальной переменной результат, возвращаемый функцией require:
local math = require "math"
P.S. В реализации lua версии 5.1 обнаружилось, что функция foreach() работает примерно на 20% быстрее, чем эквивалентный код с использованием цикла while. При этом функция Foreachi() на 20% медленнее цикла while.