Контрольный пример 1: a
и b
оба глобальные, без внедрения.
$ cat junk.lua ; time lua junk.lua
function a(n)
return n + 1
end
function b(n)
return a(n)
end
for c = 1, 10000000 do
b(c)
end
real 0m1.743s
user 0m1.740s
sys 0m0.000s
Время пользователя: 1,74 с .
Контрольный пример 2: a
локальный, b
глобальный, без внедрения.
local function a(n)
return n + 1
end
function b(n)
return a(n)
end
for c = 1, 10000000 do
b(c)
end
real 0m1.388s
user 0m1.390s
sys 0m0.000s
Время пользователя 1,39 с .
Контрольный пример 3: a
и b
оба локальные, без встраивания.
$ cat junk.lua ; time lua junk.lua
local function a(n)
return n + 1
end
local function b(n)
return a(n)
end
for c = 1, 10000000 do
b(c)
end
real 0m1.194s
user 0m1.200s
sys 0m0.000s
Время пользователя 1,2 с .
Контрольный пример 4: a
, встроенный в b
, a
global, b
local.
$ cat junk.lua ; time lua junk.lua
local function b(n)
function a(n)
return n + 1
end
return a(n)
end
for c = 1, 10000000 do
b(c)
end
real 0m2.804s
user 0m2.790s
sys 0m0.000s
Время пользователя: 2,79 с . (!)
Контрольный пример 5: a
, встроенный в b
, оба локальные.
$ cat junk.lua ; time lua junk.lua
local function b(n)
local function a(n)
return n + 1
end
return a(n)
end
for c = 1, 10000000 do
b(c)
end
real 0m2.540s
user 0m2.530s
sys 0m0.000s
Время пользователя: 2,53 с .
Сводка результатов:
- Легко написать тесты, чтобы подтвердить или опровергнуть интуицию о производительности. Вы, вероятно, должны сделать это вместо того, чтобы полагаться на краудсорсинг. (Видите ли, толпа часто ошибается.)
- Создание функций локальных вместо глобальных оказывает существенное положительное влияние на накладные расходы при вызове функций. (Примерно на 30% лучше в этом наборе тестовых случаев, когда обе функции были локальными.)
- Встраивание функции в другую функцию оказывает серьезное негативное влияние на накладные расходы при вызове функции. (Примерно на 110% хуже в этом наборе тестовых случаев, когда обе функции были локальными.)
- Я упоминал, что тестирование, вероятно, является хорошей идеей вместо доверия аудитории?