一体どの書き方がいいの?その1 | blog lab 【アメブロカスタマイズとネタ話】

blog lab 【アメブロカスタマイズとネタ話】

コメント欄にプロフィール画像、などのカスタマイズの小ネタと、普段の話のネタを書いていきます。

javascriptは実にいろんな意味で奥が深く、書き方にも様々なTipsがあったりします。
今日は実行時パフォーマンスについてのTipsの検証を小ネタ的にやってみようかと思います。
ネタがあんましないので小出しにちょっとずつやりたいと思いますw

絶対値を求める

絶対値はビルトインのMath.absで求めることができますが、なぜかECMAScript系言語のMath.absはどれもも遅いので使うことが殆どありません。
最近のブラウザではどの絶対値の求め方が最も速いのか、Math.absの他に2つ用意して検証してみました。

(function(){
var numtest = 1000000;
var num = ~~(Math.random()*10)-5;

/*Math.abs*/
var t = +new Date;
for(var i = 0;i < numtest;i ++){
Math.abs(num);
};
var res = +new Date - t;
$("#plog1").append("Math.abs : "+ Math.abs(num) +"<br />" + res + "msec<br />");

/*num < 0 ? -num : num*/
t = +new Date;
for(var i = 0;i < numtest;i ++){
num < 0 ? -num : num;
};
res = +new Date - t;
$("#plog1").append("<br />num < 0 ? -num : num : " + (num < 0 ? -num : num) +"<br />" + res + "msec<br />");

/*(num ^ (num >> 31)) - (num >> 31)*/
t = +new Date;
for(var i = 0;i < numtest;i ++){
(num ^ (num >> 31)) - (num >> 31);
};
res = +new Date - t;
$("#plog1").append("<br />(num ^ (num >> 31)) - (num >> 31) : " + ((num ^ (num >> 31)) - (num >> 31)) +"<br />" + res + "msec<br />");
})();
結果
Math.abs : 5
21msec

num < 0 ? -num : num : 5
12msec

(num ^ (num >> 31)) - (num >> 31) : 5
12msec

各100万回ループさせていますが、num < 0 ? -num : numが最も速いみたいです。
ActionScriptで最も速かった(num ^ (num >> 31)) - (num >> 31)は、javascriptではそれほどでもなさそう。
javascriptではActionScript3と違って、Int型(整数)が存在せず数字は全てNumber型(小数)なので、ビット演算は速くないし不正確なので避けたほうが良いかもしれません。


new Date().getTime()

new Date().getTime()はキャッシュ対策くらいにしか使わないような気もしますが、一応検証してみます。
+new Dateとnew Date().valueOf()の比較をしてみます。

(function(){
var numtest = 50000;

/*new Date().getTime()*/
var t = +new Date;
for(var i = 0;i < numtest;i ++){
new Date().getTime();
};
var res = +new Date - t;
$("#plog2").append("new Date().getTime() : "+ new Date().getTime() +"<br />" + res + "msec<br />");

/*+new Date;*/
t = +new Date;
for(var i = 0;i < numtest;i ++){
+new Date;
};
res = +new Date - t;
$("#plog2").append("<br />+new Date : " + +new Date +"<br />" + res + "msec<br />");

/*new Date().valueOf()*/
t = +new Date;
for(var i = 0;i < numtest;i ++){
new Date().valueOf()
};
res = +new Date - t;
$("#plog2").append("<br />new Date().valueOf() : " + new Date().valueOf() +"<br />" + res + "msec<br />");
})();
結果
new Date().getTime() : 1297562549391
27msec

+new Date : 1297562549434
42msec

new Date().valueOf() : 1297562549446
12msec

こちらは5万回のループ。
+new Dateは遅く、new Date().valueOf()とnew Date().getTime()はほぼ互角。
new Date().valueOf()が若干速い気がしますが、素直にnew Date().getTime()がいいかもしれません。

・・・とここで眠くなってきたので続きは次回w