2010年7月7日水曜日

ExtendScriptで、for文のiを外に出すと速いのか?

たまに、for文の中の変数(よく使うのはi)を、for文の外に出すと速くなる、と聞く。
本当かな?と思ったので試してみた。
var ary = new Array(999999);
var start,end;

//iを中で宣言、ary.lengthを変数に渡さない
start = new Date().getTime();
for(var i1=0;i1<ary.length;i1++){}; //test1
end = new Date().getTime();
$.writeln('test1 -> '+(end-start));

//iを中で宣言、ary.lengthを中で変数に渡す
start = new Date().getTime();
for(var i2=0,len2=ary.length;i2<len2;i2++){}; //test2
end = new Date().getTime();
$.writeln('test2 -> '+(end-start));

//i、ary.lengthをfor文の外で宣言
start = new Date().getTime();
var i3=0,len3=ary.length;
for(;i3<len3;i3++){}; //test3
end = new Date().getTime();
$.writeln('test3 -> '+(end-start));

結果は、
test1 -> 1293
test2 -> 726
test3 -> 730
ということになった。配列の数をfor文中の最初で変数に入れるのは明らかに効果があるけど、変数をfor文の外で宣言するのは、(少なくともExtendScriptでは)誤差の範囲内でしかなかった。

じゃあオブジェクトでforinだったらどうか?
//オブジェクトを作る
var obj = {};
var c = 'abcdefghijklmnopqrstuvwxyz'.split('');
var clen = c.length;
for(var i=0;i<99999;i++){
var key = [];
for(var ii=0;ii<10;ii++){key.push(c[Math.floor(Math.random()*clen)])};
obj[key.join('')]=i
};

var start,end;

//iを中で宣言
start = new Date().getTime();
for(var i1 in obj){}; //test1
end = new Date().getTime();
$.writeln('test1 -> '+(end-start));

//iを外で宣言
start = new Date().getTime();
var i2;
for(i2 in obj){}; //test2
end = new Date().getTime();
$.writeln('test2 -> '+(end-start));
オブジェクトを作るのにかなり時間がかかるけど気にしない。
結果は……
test1 -> 19256
test2 -> 19200
というわけで、誤差の範囲だった。

0 件のコメント: