Использование локальных переменных в Lua

Опубликовано в QLua

Локальные переменные в языке 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.

Недостаточно прав для комментирования

Архив QLua