производительность и оптимизация функций Lua - PullRequest
5 голосов
/ 22 марта 2020

Поскольку у нас есть несколько мастеров программирования, я решил спросить вас, ребята, вместо того, чтобы пытаться угадать.

В свои дни я провел много оптимизаций, и в большинстве В таких случаях такой уровень оптимизации был бы совершенно ненужным.

Однако я не уверен, почему метод 1, см. ниже, примерно в 2-2,5 раза быстрее, чем метод 2, см. ниже. Я ожидал бы, что, поскольку функция X метода 2 содержит функцию Y, она будет по крайней мере такой же быстрой, если не быстрее, чем метод 1, где обе функции разделены.

В чем причина того, что метод 1 был значительно быстрее, чем метод 2? Это какая-то оптимизация компилятора?

-- METHOD 1: 

local function Y()
    return true
end

local function X()
    Y()
    return true
end

local getTimer = system.getTimer
local startTime = getTimer()
local iterations = 1000000

for i = 1, iterations do
    X()
end

print( "TIME:"..(getTimer()-startTime) )

-- METHOD 2:

local function X()

    local function Y()
        return true
    end

    Y()

    return true
end

local getTimer = system.getTimer
local startTime = getTimer()
local iterations = 1000000

for i = 1, iterations do
    X()
end

print( "TIME:"..(getTimer()-startTime) )

1 Ответ

3 голосов
/ 22 марта 2020

Функции являются реальными объектами в Lua. Вы создаете экземпляр такого объекта из прототипа и помещаете его в переменную с именем Y. Это имеет определенную цену: выделение, подключение отладочной информации, закрытие любых повышений и т. Д. См. здесь для некоторых соответствующих битов.

В # 2 вы делаете это каждый раз. Кроме того, в конце X Y выходит из области видимости, не ссылаясь ни на что другое, и поэтому становится мусором, внося вклад в коллекцию в какой-то момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...