JavaScriptで文字列比較は抽象的等価比較の方が速い
以下は間違っているのでこれを参照して下さい。
等価演算子と厳密等価演算子 in ECMA-262 3rd Edition - 0x集積蔵でString同士をやっていないので、やったら、結果が逆転しているような気がする。ただ、アルゴリズムを見る限りはどちらも同じような感じの経路をたどるんだよなぁ……。わけわからんけど、高速化のために等価比較いじるよりも、アルゴリズムを見直すことが重要なのはよくわかった。
でも、IEに限るけど、文字リテラルとか一時的にでもいいから変数に入れた方がパフォーマンスがいいことがよくわかったw
IE7
抽象的等価比較 String == String 354 厳密等価比較 String === String 411 抽象的等価比較 String == String 244 厳密等価比較 String === String 253
Fx3
抽象的等価比較 String == String 42 厳密等価比較 String === String 45 抽象的等価比較 String == String 49 厳密等価比較 String === String 59
ベンチマーク
function write() { var str = []; for (var i = 0, j = arguments.length; i < j; ++i) str[i] = arguments[i]; document.write(str.join(' ') + '<br>'); } var arrN = [],arrS = [],arrO = []; for(var i=0;i<150000;i++)arrS[i]=""+Math.ceil(Math.random()*6); // 1〜6の乱数を文字列にしたものを生成 (function (arr) { write("抽象的等価比較 String == String"); var d=new Date; for(var i=0,j=arr.length;i<j;++i)arr[i]=="6"; write((new Date)-d); })(arrS.concat()); (function (arr) { write("厳密等価比較 String === String"); var d=new Date; for(var i=0,j=arr.length;i<j;++i)arr[i]==="6"; write((new Date)-d); })(arrS.concat()); (function (arr) { write("抽象的等価比較 String == String"); var d=new Date; for(var i=0,j=arr.length,a="6";i<j;++i)arr[i]==a; write((new Date)-d); })(arrS.concat()); (function (arr) { write("厳密等価比較 String === String"); var d=new Date; for(var i=0,j=arr.length,a="6";i<j;++i)arr[i]===a; write((new Date)-d); })(arrS.concat());