При выполнении итерации по массиву каждый цикл выполняется быстрее в моих тестах.
var len:int = 1000000;
var i:int = 0;
var arr:Array = [];
while(i < len) {
arr[i] = i;
i++;
}
function forEachLoop():void {
var t:Number = getTimer();
var sum:Number = 0;
for each(var num:Number in arr) {
sum += num;
}
trace("forEachLoop :", (getTimer() - t));
}
function whileLoop():void {
var t:Number = getTimer();
var sum:Number = 0;
var i:int = 0;
while(i < len) {
sum += arr[i] as Number;
i++;
}
trace("whileLoop :", (getTimer() - t));
}
forEachLoop();
whileLoop();
Это дает:
forEachLoop: 87
whileLoop: 967
Здесь, вероятно, большую часть времени цикла тратится на приведение элемента массива к числу. Тем не менее, я считаю это справедливым сравнением, поскольку именно это вы получаете в каждом цикле.
Я предполагаю, что это различие связано с тем, что, как уже упоминалось, оператор as является относительно дорогим, а доступ к массиву также относительно медленным. Я думаю, что для каждого цикла обе операции обрабатываются изначально, в отличие от выполнения в Actionscript.
Обратите внимание, однако, что если преобразование типов действительно имеет место, то для каждой версии намного медленнее, а версия while заметно быстрее (хотя, тем не менее, для каждой доли в то время):
Чтобы проверить, измените инициализацию массива на это:
while(i < len) {
arr[i] = i + "";
i++;
}
А теперь результаты:
forEachLoop: 328
whileLoop: 366
forEachLoop: 324
whileLoop: 369