Как Flash справляется с моей анонимной функцией? - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть класс связанного списка, в котором хранится связанная коллекция объектов.

Я добавил iterate() метод к этому классу, к которому я скептически отношусь. Он принимает функцию в качестве единственного аргумента, который должен принимать только экземпляр Entity.

т.е.

list.iterate(function(entity:Entity)
{
    trace(entity.id);

});

Меня беспокоит этот метод, потому что я не уверен, что произойдет с функцией, которую я дал iterate() в этом случае. Повлияет ли то, что я делаю, на производительность или использование памяти в моей игре по сравнению с выполнением моих итераций вручную, например так:

var i:Entity = list.first;
while(i != null)
{
    trace(i.id);

    i = i.next;
}

Любая информация по этому вопросу приветствуется.

Ответы [ 3 ]

1 голос
/ 20 февраля 2012
list.iterate(function(entity:Entity)
{
    trace(entity.id);

});

хуже, чем

var i:Entity = list.first;
while(i != null)
{
    trace(i.id);

    i = i.next;
}

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

И цикл whileЯ думаю, это будет более производительным, чем использование чего-то подобного:

list.iterate(nonStaticNonNestedFunction);

, потому что все еще есть издержки на вызов функции, даже если она меньше, чем издержки вложенной функции.

1 голос
/ 20 февраля 2012

Вложенные функции - это замыкания, а замыкания вызывают медленно.Если вам нужна производительность, лучше всего использовать нестатические функции без вложенности (проверьте ее с помощью getTimer, если вы не верите тестам Джексона Данстана.)

0 голосов
/ 20 февраля 2012

Хотя анонимные функции распространены во многих языках, принято их не использовать.Они делают код менее понятным, их сложно отлаживать, и они медленны до чертиков.

И дело даже не в том, чтобы вызывать вложенную функцию.Конечно, это медленнее, чем вызов функции NOT, но настоящая причина в том, что если в методе класса есть объявление анонимной функции, то компилятор AS3 создает специальный объект Activation в байт-коде, а виртуальная машина должна сохранять все локальные переменные, чтобы сделать их доступными для этой функции.Это делает этот конкретный метод медленным.Даже если вы не вызываете анонимную функцию внутри, а просто объявляете ее.

Как и все методы оптимизации, они должны соблюдаться правильно.Если вы получили замыкание, которое вызывается как один раз за кадр, вы не заметите никаких замедлений.Но, как я вижу, вы получили связанный список, который может быть длинным и повторяться несколько раз за кадр.Это может привести к некоторой потере производительности.

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