Flash如何处理我的匿名函数?

时间:2012-02-20 02:19:41

标签: performance flash actionscript-3 memory-management actionscript

我有一个链表类,用于存储链接的实体集合。

我在这个课程中添加了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 个答案:

答案 0 :(得分:1)

嵌套函数是闭包,闭包调用很慢。如果你需要表现,最好的选择是非静态非嵌套功能(如果你不相信杰克逊邓斯坦的测试,可以用getTimer进行测试。)

答案 1 :(得分:1)

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);

因为调用函数仍然存在开销,即使它小于嵌套函数的开销。

答案 2 :(得分:0)

尽管匿名函数在许多语言中很常见,但是不使用它们是一种常见的惯例。它们使代码不太清晰,难以调试,而且它们很慢。

这甚至不是调用嵌套函数的问题。它比不调用函数慢,但真正的原因是ff在类方法中有一个匿名函数声明AS3编译器在字节码中创建特殊的激活对象,虚拟机必须保存所有局部变量以使它们可以被这个函数访问。这使得这种特殊方法变慢。即使您没有在内部调用匿名函数,也只是声明它。

正如所有优化技术一样,要正确遵循它们。如果你有一个类似于每帧一次的闭包,你将不会注意到任何减速。但是当我看到你有一个链表时,它可能很长并且每帧迭代多次。这可能会导致性能下降。