gpt4 book ai didi

performance - 对于 VS Foreach on Array 性能(在 AS3/Flex 中)

转载 作者:行者123 更新时间:2023-12-03 14:47:38 26 4
gpt4 key购买 nike

哪个更快?为什么?

var messages:Array = [.....]

// 1 - for
var len:int = messages.length;
for (var i:int = 0; i < len; i++) {
var o:Object = messages[i];
// ...
}

// 2 - foreach
for each (var o:Object in messages) {
// ...
}

最佳答案

从我坐的地方,普通 for循环比 for each 稍快在最小情况下循环。此外,与 AS2 天一样,通过 for 递减您的方式循环通常提供非常小的改进。

但实际上,这里的任何细微差别都将与您在循环内实际执行的操作的要求相形见绌。您可以找到在任何一种情况下都会更快或更慢的操作。真正的答案是,两种循环都不能说比另一种循环快——您必须在代码出现在您的应用程序中时对其进行分析。

示例代码:

var size:Number = 10000000;
var arr:Array = [];
for (var i:int=0; i<size; i++) { arr[i] = i; }
var time:Number, o:Object;

// for()
time = getTimer();
for (i=0; i<size; i++) { arr[i]; }
trace("for test: "+(getTimer()-time)+"ms");

// for() reversed
time = getTimer();
for (i=size-1; i>=0; i--) { arr[i]; }
trace("for reversed test: "+(getTimer()-time)+"ms");

// for..in
time = getTimer();
for each(o in arr) { o; }
trace("for each test: "+(getTimer()-time)+"ms");

结果:
for test: 124ms
for reversed test: 110ms
for each test: 261ms

编辑:为了改进比较,我更改了内部循环,因此它们除了访问集合值之外什么都不做。

编辑 2:对 oshyshko 评论的回答:
  • 编译器可以跳过我内部循环中的访问,但事实并非如此。如果是这样,循环退出的速度会快两到三倍。
  • 您发布的示例代码中的结果发生了变化,因为在该版本中,for循环现在具有隐式类型转换。为了避免这种情况,我将作业排除在循环之外。
    当然,有人可能会争辩说,在 for 中添加额外 Actor 是可以的。循环,因为无论如何“真正的代码”都需要它,但对我来说,这只是另一种说法“没有通用的答案;哪个循环更快取决于你在循环中做什么”。这就是我给你的答案。 ;)
  • 关于performance - 对于 VS Foreach on Array 性能(在 AS3/Flex 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1010859/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com