うめすこんぶ

日々のプログラミングで残しておきたいメモ.何かの役に立てれば幸いです.

javascriptの文字列→整数変換で最速な方法は?

スポンサーリンク

javascriptでは文字列から整数への変換方法は色々あります.せっかくなので処理速度が良い物を使いたいものです.ですので,簡単に処理速度を計測してみました. 文字列→整数以外も今後測ってみます.

文字列から整数の変換方法まとめ

parseInt(str, 10);
str&-1;
-1&str;
str|0;
0|str;
str^0;
0^str;
str>>0;
str<<0;
~~str;

参考

たまにメモる。: JavaScriptにおける数値と文字列の相互変換を参考にさせていただきました.文字列から数値への変換だけでなく,整数⇔小数の変換など詳しく書いてあります.お勧めです.

環境

PC:

Windows 7 32bit , Intel Core i3 3.20GHz

ブラウザ:

ベンチマーク関数

簡単な処理時間計測関数を作ってみます. benchmarkN(n, f)はn回関数fを実行します.applyを使用することにより,関数fに適用する引数もbenchmarkN(n, f, s)のように追加で引数として加えられるようにしてあります.

//処理時間計測関数
function benchmarkN(n, f) {
    var args = Array.prototype.slice.call(arguments).slice(2);
    var s = new Date();
    
    for(var i = 0; i < n; i++){
        f.apply(null, args);
    }

    return new Date() - s;
}

var n = 10000000; //関数呼び出し回数
var s = "1234567"; //テスト用文字列

//テスト
for (var i = 0; i < fs.length; i++) {
    var t = benchmarkN(n, fs[i], s);
    console.log(fs[i].toString() + "\t\t// time =" + t + "msec.");
}

結果

chrome
function (str){ return parseInt(str); }     // time = 561 msec.
function (str){ return parseInt(str, 10); }      // time = 484 msec.
function (str){ return str&-1; }     // time = 780 msec.
function (str){ return -1&str; }     // time = 749 msec.
function (str){ return str|0; }      // time = 734 msec.
function (str){ return 0|str; }      // time = 733 msec.
function (str){ return str^0; }      // time = 733 msec.
function (str){ return 0^str; }      // time = 811 msec.
function (str){ return str>>0; }       // time = 780 msec.
function (str){ return str<<0; }       // time = 733 msec.
function (str){ return ~~str; }      // time = 749 msec.
firefox
function (str){ return parseInt(str); }     // time = 782 msec.
function (str){ return parseInt(str, 10); }      // time = 802 msec.
function (str){ return str&-1; }     // time = 915 msec.
function (str){ return -1&str; }     // time = 915 msec.
function (str){ return str|0; }      // time = 917 msec.
function (str){ return 0|str; }      // time = 930 msec.
function (str){ return str^0; }      // time = 915 msec.
function (str){ return 0^str; }      // time = 930 msec.
function (str){ return str>>0; }       // time = 929 msec.
function (str){ return str<<0; }       // time = 932 msec.
function (str){ return ~~str; }      // time = 936 msec.

グラフ

もう一回測りなおしてグラフを作成してみました.

f:id:konbu13:20140108215749j:plain

最速は,parseInt(str, 10)です! ビット演算子を使用する手法と比べますと,明らかに速いことがわかりました.やっぱり正統派な方法で変換しましょう,ということですかね. parseInt(str, 10)parseInt(str)では,何度か測ってみたところそこまで変わらなかったので,使用するとしたらparseInt(str)が妥当でしょうか.