我有一个链表类,用于存储链接的实体集合。
我在这个课程中添加了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 :(得分: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编译器在字节码中创建特殊的激活对象,虚拟机必须保存所有局部变量以使它们可以被这个函数访问。这使得这种特殊方法变慢。即使您没有在内部调用匿名函数,也只是声明它。
正如所有优化技术一样,要正确遵循它们。如果你有一个类似于每帧一次的闭包,你将不会注意到任何减速。但是当我看到你有一个链表时,它可能很长并且每帧迭代多次。这可能会导致性能下降。