Разница во времени выполнения обусловлена разницей между поиском в хеш-таблице и поиском в массиве.Интерпретатор может разместить локальную переменную в регистре ЦП, но даже без такой хитрости локальные переменные становятся более быстрыми.
Глобальные переменные в Lua хранятся в таблицах.Как правило, любой может изменить эти таблицы, и поэтому интерпретатор должен искать значение заново каждый раз, когда к нему обращаются.Локальные переменные, с другой стороны, исчезают только тогда, когда они выходят из области видимости.Поэтому они могут иметь фиксированные местоположения в массиве.
Приведенная ниже программа тестирования вызывает фиктивную функцию в цикле.Эталонный тест показывает, как увеличивается время выполнения, чем больше таблиц должна пройти программа.
Ожидается, что другие динамические языки будут иметь аналогичные характеристики;см., например, тест Python в самом конце.
Некоторые соответствующие ссылки:
Файл demo.lua
:
local M = {}
_G.demo = M
function M.op(x) return x end
return M
Файл main.lua
:
local M = require "demo"
op = demo.op
local outer_op = demo.op
function iter_op(n)
local inner_op = demo.op
for i = 1, n do
-- Example running times for n = 100,000,000 (Lua 5.2.0):
-- Lookup a table (demo or _G), then lookup 'op'
-- within that table:
--
-- demo.op(i) --> 0:40
-- _G.op(i) --> 0:39
-- Lookup 'op' within a known local table (M or the table of
-- globals):
--
-- M.op(i) --> 0:30
-- op(i) --> 0:30
-- Dereference a local variable declared inside or outside
-- of this iter_op() function:
--
-- inner_op(i) --> 0:23
-- outer_op(i) --> 0:22
end
end
iter_op(100000000)
Файл main.py
:
import demo # Contains 'def op(x): return x'.
global_op = demo.op
def iter_op(n):
local_op = demo.op
for i in xrange(n):
# Example running times for n = 50,000,000 (Python 2.6.5):
# demo.op(i) # 0:50
# global_op(i) # 0:41
local_op(i) # 0:36
iter_op(50000000)