2

У меня есть связанный список, в котором хранится связанная коллекция объектов.Как Flash справляется с моей анонимной функцией?

Я добавил метод 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; 
} 

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

+0

Вы оценили до и после изменения? – jweyrich

+0

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

+0

Как выполняется итерация? – sch

ответ

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

}); 

хуже

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

    i = i.next; 
} 

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

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

list.iterate(nonStaticNonNestedFunction); 

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

1

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

0

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

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

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

Смежные вопросы