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 2012-02-20 02:25:12

+0

例如,您可以通过运行每种方法一百万次来执行基准测试,并比较它们所采用的时间。我现在没有Flash Builder来运行测试,但我很确定迭代方法会慢很多。 – sch 2012-02-20 02:41:32

+0

迭代如何实现? – sch 2012-02-20 05:56:04

回答

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

,因为还有调用函数的开销,即使是小于嵌套函数的开销。

1

嵌套函数是闭包,闭包呼叫很慢。如果您需要的性能,最好的办法是无静电无嵌套函数(与getTimer测试它,如果你不相信杰克逊Dunstan的测试。)

0

虽然匿名函数在很多语言中都很常见,但不使用它们是一种常见的约定。它们使代码不太清晰,它们很难调试,并且速度很慢。

这甚至不是调用嵌套函数的问题。它的速度比NOT调用函数慢,但真正的原因是,如果在类方法中存在匿名函数声明,AS3编译器会在字节码中创建特殊的Activation对象,并且虚拟机必须保存所有局部变量以使其可以访问此函数。这使得这种特殊的方法变得缓慢即使你不在内部调用匿名函数,但只是声明它。

由于所有优化技术都要正确遵循。如果你得到一个像每帧一次的闭包,你将不会注意到任何减速。但正如我看到你有一个链接列表可能很长,并且每帧重复多次。这可能会导致一些性能损失。