我一直在阅读有关代码优化的内容(更准确地说,是ActionScript 3的代码优化),我有几个问题。
哪个更好,负循环(即在循环中向后计数并检查是否达到零)或foreach循环?这两个选项似乎都比普通的“for”循环要好,但是哪个选项更快?
使用Numbers或ints哪个更好?
常量是否真的会降低您的表现?
我已经尝试过编写一个简单的代码并自己测试,但结果却到处都是,我访问的一些网站有点意见相反!
答案 0 :(得分:2)
“1)哪个更好,负循环(即在循环中向后计数并检查是否达到零)或foreach循环?两个选项似乎都优于正常的”for“循环,但更快两个?“
通过foreach,我将假设你的意思是..each或for..in循环。正如德米安所指出的那样,因为每个人都很慢。对于其他人来说,做一个简单的for循环总是更快(你可以提早退出所有这些,除了我认为的每一个),只需当你点击你需要的支票时返回)。无论你是做我++还是我 - 都没有区别。 for..each和for..in循环虽然有它们的好处。 for..in是循环遍历Dictionary
和Object
对象的唯一方法,而for..each为您执行演员表示,这意味着您编写的代码更少。如:
for each( var s:Sprite in this.m_mySpriteVector )
...
VS
var len:int = this.m_mySpriteVector.length;
for( var i:int = 0; i < len; i++ )
var s:Sprite = this.m_mySpriteVector[i];
(侧面说明,如果你正在做一个正常的循环,取出长度是你可以做的最好的事情来加快它)。另请注意,for循环中的速度差异只有在它们是大循环时才真正重要。如果你正在进行10循环,那么你选择哪一个并没有什么区别。
“2)哪个更好,使用数字或整数?”
如果你的意思是循环,那么总是去找int。在其他一般术语中,使用代表您需要的类。如果您只需要整数,请使用int
或uint
。如果您需要小数,请转到Number
。使用错误的类型,你会受到一个小的惩罚,但不是一个巨大的惩罚。此外,根据您在变量中的含义,可能不是您认为的类型:http://jacksondunstan.com/articles/1357
“3)常量是否真的会降低你的表现?”
我还没有真正测试过,但可能还不够重要。使用1,000,000次迭代或其他东西做一个简单的循环,看看它是否有所作为。使用静态const会因为必须执行类查找而产生一个小的惩罚,但它并不苛刻
要做的最后一点是要注意优化。也有它在你的头脑中,所以你不要编写糟糕的代码,但要小心你应用它。优化的代码通常需要更长的时间来编写,并且比其他代码的可读性更低(for..each循环是一个很好的例子)。
考虑每个代码的使用位置。如果它是所谓的性能关键代码 - 一直调用的代码(ENTER_FRAME,或常用函数),那么您应该集中精力。如果它是一个被调用过一次或不经常被调用的函数,那么你花在优化它上面的时间将是一种浪费,因为你从它那里获得的收益很少。
答案 1 :(得分:1)
1)哪个是更好的负循环(即在循环中向后计数) 并检查你是否达到零)或foreach循环。两种选择似乎都是 比正常的“for”循环更好,但我想知道哪个更快 这两个人?
这一切都取决于你的逻辑。如果你有一个退出条件,在递减时会很快满足,那么负面是可行的方法。至于forEach
,我认为它取决于你使用它的 。以下面的例子为例:
A
var vec:Vector.<String> = new Vector.<String>();
vec.forEach(function(s:String, idx:int, v:Vector.<String>):void {
trace(s);
});
<强>乙强>
function onIteration(s:String, idx:int, v:Vector.<String>):void {
trace(s);
}
var vec:Vector.<String> = new Vector.<String>();
vec.forEach(onIteration);
在 A 中,除非Flash编译器做了一些惊人的优化(并且我很确定它没有),否则会在每次迭代时创建一个新的匿名函数,这显然比简单的for
循环更昂贵。
B 已经定义了函数,所以它只是函数调用的额外查找。我认为这个和普通for
循环之间的性能差异很小,如果存在的话(虽然没有对它进行分析)。
2)使用Numbers或ints哪个更好?
这取决于您的具体情况。如果需要浮点数,请使用Number
。否则,请使用int
。如果您的价值永远不会消极,请使用uint
。我认为AV int
和uint
s的AVM2计算会比Number
更快,因为没有浮点运算,但我没有对它进行分析,所以我'我不是100%肯定。
3)常数是否真的会降低你的表现?
我从未在子喷气机上听过任何声音。我无法看到它如何使变量成为只读。如果 有任何差异,那么它就会一无所获。