Только что обнаружил где я тупанул с тестом. Все таки FOR быстрее, чем FOR IN и FOR EACH IN.
Проблема теста здесь:

Код AS3:
for (i = 0; i < length; i++) {
obj = array[i]; // вот тут я сделал присвоение, а надо было сразу обращаться к array[i].t
obj.t = 0;
}
Присвоение переменной и отжирало дополнительное время. Мой косяк.
Самый быстрый FOR (при условии, что длинна массива сразу записывается в переменную), на втором месте FOR EACH IN, а FOR IN - самый медленный.
Вот новый тест

Код AS3:
var i:int = 0;
var time:int = 0;
var vec:Vector.<Object> = new Vector.<Object>();
var arr:Array = [];
var length:int = 0;
var j:Object;
for (i = 0; i < 10000000; i++) {
var obj:Object = { t: 0 };
vec[i] = obj;
arr[i] = obj;
}
var tf:TextField = new TextField();
tf.width = 800;
tf.height = 600;
addChild(tf);
// VECTOR TEST START
time = getTimer();
length = vec.length;
for (i = 0; i < length; i++) {
vec[i].t = 1;
}
tf.appendText("Vector for i " + (getTimer() - time) + "\n");
// ARRAY TEST START
time = getTimer();
length = arr.length;
for (i = 0; i < length; i++) {
arr[i].t = 2;
}
tf.appendText("Array for i " + (getTimer() - time) + "\n");
// VECTOR FOR EACH IN
time = getTimer();
for each (obj in vec) {
obj.t = 3;
}
tf.appendText("Vector for each in " + (getTimer() - time) + "\n");
// ARRAY FOR EACH IN
time = getTimer();
for each (obj in arr) {
obj.t = 4;
}
tf.appendText("Array for each in " + (getTimer() - time) + "\n");
// VECTOR FOR IN
time = getTimer();
for (j in vec) {
vec[j].t = 3;
}
tf.appendText("Vector for in " + (getTimer() - time) + "\n");
// ARRAY FOR IN
time = getTimer();
for (j in arr) {
arr[j].t = 4;
}
tf.appendText("Array for in " + (getTimer() - time) + "\n");
Результаты
Цитата:
Vector for i 430
Array for i 435
Vector for each in 620
Array for each in 609
Vector for in 671
Array for in 674
|
Но вот что меня немного удивило на этот раз, это то, что вектор не выдал какой-либо существенной разницы по сравнению с простым массивом на однотипных объектах.