2013-05-08

JavaScript環境性能比較してみた - indexOf と RegExp の速度比較 (2013/05/08版) +α

















JavaScript初めたばかりで、やっと正規表現に出会ったので速度比較とかやってみたく色々調べてたら下記サイト様を見つけました。大変参考になりました!ありがとうございます。

indexOf と RegExp の速度比較

これが2010/03/30の記事でしたので、サクッと2013/05/08版をやってみた次第でございます。二番煎じ企画。乙!!

ベンチマーク

ベンチマーク用のhtmlベタ書きのJavaScriptソースはこんな感じで実装されています。ボタン押すだけ。

今回はChromeと同じV8で動いているNode.jsでも試してみたのでそちらのソースはこんな感じ。
var a = [], n=10000;
for(var i=0; i<n; i++){
a.push('item:' + i);}
var str = a.join('\n');
// test1
var s = new Date();
for(var i=0; i<3000; i++){
var m = str.indexOf('item:9999');
}
console.log('#test1 ' + (new Date() - s) + '(ms) result:'+ m);
// test2
var s = new Date();
for(var i=0; i<3000; i++){
var m = /item:9999/.exec(str);
}
console.log('#test2 ' + (new Date() - s) + '(ms) result:'+ m);
// test3
var s = new Date();
for(var i=0; i<3000; i++){
var m = new RegExp('item:9999').exec(str);
}
console.log('#test3 ' + (new Date() - s) + '(ms) result:'+ m);
// test4
var s = new Date();
for(var i=0; i<3000; i++){
var m = /item:9999$/.exec(str);
}
console.log('#test4 ' + (new Date() - s) + '(ms) result:'+ m);
view raw jsRegExpPerf.js hosted with ❤ by GitHub


結果

PCブラウザ+Node.js

グラフの番号は 
(1)indexOf : str.indexOf('item:9999')
(2)静的な正規表現 : /item:9999/.exec(str)
(3)動的生成の正規表現 : new RegExp('item:9999').exec(str)
(4)正規表現 : /item:9999$/.exec(str)
となっています。

Figure 1. PCブラウザとNode.jsの正規表現性能比較

Chromeェ…すげぇ…。4に関しては1msとかでした。
マジか…。

おまけ:iOSでの比較


Figure 2. iPhone標準ブラウザとアプリ内ブラウザの正規表現性能比較

こちらはちょっとおまけで調べたiPhoneでの性能比較。
アプリ内ブラウザにはChromeのiOS版を使ったんですが、Chromeって名前なだけなんですね。。というかAppleのネイティブにブラウザ埋め込んだアプリ締め出しの裏構図が見えてコワイ。。。


まとめ

Node.jsでの性能が知りたかっただけなんですが、色々やったら色々わかって面白かったです。
NodeはChromeと同じくらいのパフォーマンスがでるというのがわかったので、カリカリに作る必要がなければどんなやり方でも行けそうですね。
ただ、$つかった時みたいに明らかな正規表現をするときは速度に差が出るみたいなので、適時パフォーマンス見るのが良さそうです。

iPhoneの結果は面白いくらいアプリ内ブラウザ開発やる気見えなくてコワイですね。
ブラウザアプリラップしただけのネイティブアプリが、一時期締め出し食らったりしてるみたいですし、不便さが勝ってみんな撤退しろー…なんてことを考えてるんですかね?
くわばらくわばら。

Androidは貸してもらえなかったのでまた今度出来ればやります。

えっIE…?おや、誰か来たみたいなのでこの辺で。

0 件のコメント: