JavaScriptã®æ£è¦è¡¨ç¾ã®ãƒ‘フォーマンスã«èˆˆå‘³ãŒã‚ã£ãŸã®ã§èª¿ã¹ã¦ã¿ã¾ã—ãŸã€‚
ç¾æ™‚点ã§ã®è€ƒå¯Ÿã§ã‚りã€JavaScriptã®å‡¦ç†ç³»ã«ã‚ˆã‚‹é•ã„ã‚‚ã‚りã¾ã™ã—ã€å°†æ¥çš„ã«æœ€é©åŒ–ãŒé€²ã‚“ã å ´åˆã¯çµæžœãŒå¤‰ã‚ã‚‹ã“ã¨ãŒã‚ã‚‹ã¨æ€ã„ã¾ã™ã®ã§ã€ã”注æ„を。
ã¾ãšã€åˆã‚ã«è¦‹ã¤ã‘ãŸè¨˜äº‹ãŒã€ã“れ。
http://stackoverflow.com/questions/9750338/dynamic-vs-inline-regexp-performance-in-javascript
ç°¡å˜ã«è¨€ã†ã¨ã€
/[a-z]/.exec(str);
ã¨
new RegExp('[a-z]').exec(str);
ã§ã€ãƒ‘フォーマンスãŒé•ã†ã‘ã©ä½•ã§ï¼Ÿã¨ã„ã†è³ªå•ã§ã—ãŸã€‚
çµè«–ã‹ã‚‰è¨€ã†ã¨ã€ã“れã¯ç‰ä¾¡ã§ã¯ã‚りã¾ã›ã‚“。
å‰è€…ã¯æ£è¦è¡¨ç¾ã‚’一度ã—ã‹è©•価ã—ãªã„ã®ã«å¯¾ã—ã€å¾Œè€…ã¯æ¯Žå›žRegExpオブジェクトを作りã¾ã™ã€‚
ã©ã†ã‚„ã‚‰ã€æ¬¡ã®3ã¤é–¢æ•°ã¯ã»ã¼ç‰ä¾¡ã®ã‚ˆã†ã§ã™ã€‚
function func1(str) {
return /[a-z]/.exec(str);
}
var re2 = /[a-z]/;
function func2(str) {
return re2.exec(str);
}
var re3 = new RegExp('[a-z]');
function func3(str) {
return re3.exec(str);
}
「ã»ã¼ã€ã¨ã„ã†ã®ã¯ã€å®Ÿéš›ã«ä¸èº«ã‚’見ãŸã‚ã‘ã§ã¯ãªã„ã‹ã‚‰ã§ã™ã€‚ãŸã ã€å‡¦ç†æ™‚é–“ã‹ã‚‰æŽ¨æ¸¬ã—ãŸã ã‘ã§ã™ã€‚
ã•ã¦ã€ã“ã“ã¾ã§ã¯ç†è§£ã§ãã¦ã„ãŸã®ã§ã™ãŒã€å®Ÿã¯ã“ã®çŠ¶æ…‹ã ã¨æ£è¦è¡¨ç¾ã®ã‚³ãƒ³ãƒ‘イルã¯è¡Œã‚れã¦ã„ãªã„よã†ãªã®ã§ã™ã€‚
ã©ã†ã„ã†ã“ã¨ã‹ã¨è¨€ã†ã¨ã€
var re4 = new RegExp('[a-z]');
re4.compile();
function func4(str) {
return re4.exec(str);
}
ã¨ã™ã‚‹ã¨ã€å‡¦ç†æ™‚é–“ãŒçŸããªã‚‹ã‚±ãƒ¼ã‚¹ãŒã‚ã‚‹ã®ã§ã™ã€‚
ã“れã¯ã¡ã‚‡ã£ã¨æ„外ã§ã—ãŸã€‚æ£è¦è¡¨ç¾ã®ã‚³ãƒ³ãƒ‘イルã¨ã„ã†ã®ã¯æœ€é©åŒ–ã®éŽç¨‹ã§å‹æ‰‹ã«è¡Œã‚れるã®ã‹ã¨æ€ã£ã¦ã„ã¾ã—ãŸã€‚ã‚‚ã—ã‹ã—ãŸã‚‰ã€æœ€é©åŒ–ãŒè¡Œã‚れるã®ã¯ã‚‚ã£ã¨é•·ã„時間処ç†ãŒå›žã£ã¦ã„ãªã„ã‹ã‚‰ãªã®ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€‚
ã¾ãšã¯ã€nodeã§ãƒ†ã‚¹ãƒˆã‚’ã—ã¦ã¿ã¾ã—ãŸã€‚
https://gist.github.com/dai-shi/7394062
ã“ã®ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚’走らã›ãŸã‚‰ã€ä¸€ã¤ã®æ›¸ãæ–¹ã ã‘æ˜Žã‚‰ã‹ã«é€Ÿããªã‚Šã¾ã—ãŸã€‚ãれãŒä¸Šè¨˜ã®æ›¸ãæ–¹ã§ã™ã€‚nodeã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’v0.8, v0.10, v0.11ã¨è©¦ã—ã¾ã—ãŸãŒã€å‚¾å‘ã¯ã©ã‚Œã‚‚åŒã˜ã§ã™ã€‚
次ã«jsperfã§ã‚‚試ã—ã¾ã—ãŸã€‚
http://jsperf.com/classname-check-regex-vs-indexof
ã¡ã‚‡ã£ã¨ç›®çš„ãŒé•ã†ã®ã§indexOfã¨ã®æ¯”較ãŒå…¥ã£ã¦ã„ã¾ã™ãŒã€RegExpã®æ–¹ã¯å¤§ä½“åŒã˜ã§ã™ã€‚
Chromeã§ã®å®Ÿè¡Œçµæžœã¯ã€compile()を実行ã—ãŸã‚±ãƒ¼ã‚¹ãŒã‚ãšã‹ã«é€Ÿããªã‚Šã¾ã—ãŸã€‚試ã—ã¦ã„ã‚‹æ£è¦è¡¨ç¾ãŒé•ã†ã®ã§ã€ã‚³ãƒ³ãƒ‘イルãŒåйãã«ãã„ã®ã‹ã‚‚ã—れã¾ã›ã‚“。
Firefoxã§ã®å®Ÿè¡Œçµæžœã‚‚ã€compile()ã®ã‚±ãƒ¼ã‚¹ãŒé€Ÿããªã‚Šã¾ã—ãŸã€‚ã“ã¡ã‚‰ã¯10%以上。ã—ã‹ã‚‚ã€å…¨ä½“çš„ã«Chromeã®å®Ÿè¡Œçµæžœã‚ˆã‚Šé€Ÿã„。ã¡ã‚‡ã£ã¨æ„外ã§ã™ã€‚
ã•ã¦ã€åˆ¥ã®ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚‚見ã¦ã¿ã¾ã—ょã†ã€‚
http://jsperf.com/javascript-compiled-regex/15
ã“れã¯ã€globalマッãƒã®ãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã‚‚å…¥ã£ã¦ã„ã‚‹ã®ã§ã¡ã‚‡ã£ã¨åˆ†ã‹ã‚Šã«ãã„ã§ã™ãŒã€ãれを除ã‘ã°ã‚„ã£ã±ã‚Šcompile()ã—ã¦ã„るケースãŒé€Ÿã„ã§ã™ã€‚Chromeã§20%ã»ã©ã‚¢ãƒƒãƒ—。Firefoxã§30%ã»ã©ã‚¢ãƒƒãƒ—。
ã¡ãªã¿ã«ã€globalマッãƒã¯Chromeã®å ´åˆã¯æœ€é€Ÿã§ã€Firefoxã®å ´åˆã¯ã‚‚ã£ã¨ã‚‚é…ã„よã†ã§ã™ã€‚ã“れã¯ä½¿ã„方を悩ã¿ã¾ã™ã。
ã“れらã®ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯çµæžœã‚’è¸ã¾ãˆã¦ã©ã†ã„ã†æ–¹é‡ã«ã™ã‚‹ã‹ã§ã™ãŒã€
ã¾ãšã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚µã‚¤ãƒ‰ã®ã‚³ãƒ¼ãƒ‰ã®å ´åˆã¯ã€10%~30%程度速ããªã‚‹ã“ã¨ã«ã©ã‚Œãã‚‰ã„æ„味ãŒã‚ã‚‹ã‹ã§ã™ãŒã€ã°ã‚‰ã¤ãã‚‚ã‚ã‚‹ã®ã§ã€ã‚ˆã»ã©ãƒ‘フォーマンスã«ã‚·ãƒ“ã‚¢ã§ãªã‘れã°ã€inlineåž‹ã®æ£è¦è¡¨ç¾ã§ã‚ˆã„よã†ã«æ€ã„ã¾ã™ã€‚èªã¿ã‚„ã™ã„ã¨ã„ã®ãŒæœ€å¤§ã®ãƒ¡ãƒªãƒƒãƒˆã§ã™ã€‚ã¤ã¾ã‚Šã€
/[a-z]/.exec(str);
ã“ã†ã„ã†æ„Ÿã˜ã§ã™ã€‚
一方ã€ã‚µãƒ¼ãƒã‚µã‚¤ãƒ‰ã®ã‚³ãƒ¼ãƒ‰ã€ã¤ã¾ã‚Šã€nodeã®å ´åˆã¯ã€2å€è¿‘ã速ããªã‚‹ã‚±ãƒ¼ã‚¹ã‚‚ã‚りã€ã¾ãŸé€šå¸¸ã‚µãƒ¼ãƒã‚µã‚¤ãƒ‰ã®ã‚³ãƒ¼ãƒ‰ã¯ãƒ‘フォーマンスをé‡è¦–ã™ã‚‹ã“ã¨ã‹ã‚‰ã€ç¾æ™‚点ã§ã¯compileåž‹ã®æ£è¦è¡¨ç¾ã‚’使ã†ã“ã¨ã«æ„味ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ã¤ã¾ã‚Šã€
var re = new RegExp('[a-z]');
re.compile();
function func() {
return re.exec(str);
}
ã“ã†ã„ã†æ„Ÿã˜ã§ã™ã€‚関数ã®å¤–ã§å®šç¾©ã—ãªã„ã¨ã„ã‘ãªã„ã®ã§ã€å ´åˆã«ã‚ˆã£ã¦ã¯æ°—ã‚’ã¤ã‘ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚変数åã®è¡çªã‚„ã€æ„図ã—ãªã„æ›¸ãæ›ãˆãªã©ã€‚
var func = (function() {
var re = new RegExp('[a-z]');
re.compile();
return function() {
return re.exec(str);
};
})();
ã®ã‚ˆã†ã«ã™ã‚‹æ‰‹ã‚‚ã‚りã¾ã™ãŒã€ã¾ã™ã¾ã™èªã¿ã«ãããªã£ã¦ã„ãã¾ã™ã。
本æ¥ãªã‚‰ã€re.compile()
ãŒãªãã¦ã‚‚コンパイルã—ã¦ãれãŸã‚‰ã„ã„よã†ã«æ€ã†ã®ã§ã™ãŒã€ã‚³ãƒ³ãƒ‘イルãã®ã‚‚ã®ã«ã‚³ã‚¹ãƒˆãŒã‹ã‹ã‚‹ã‚±ãƒ¼ã‚¹ã‚‚ã‚ã‚‹ã®ã§ä¸€å›žã—ã‹ä½¿ã‚ãªã„よã†ãªå ´åˆã¯ã‚³ãƒ³ãƒ‘イルã™ã¹ãã˜ã‚ƒãªã„ã¨ã„ã†ã“ã¨ã§ã™ã。JITãªã©ã®æœ€é©åŒ–ã¯ã‚ã¾ã‚Šè©³ã—ããªã„ã®ã§ã™ãŒã€ã‚‚ã—ã‹ã—ãŸã‚‰ã€æ¬¡ç¬¬ã«ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ãã®ã‹ã‚‚ã—れã¾ã›ã‚“。
ã¨ã€ã“ã“ã¾ã§æ›¸ã„ãŸã¨ã“ã‚ã§è¦‹ã¤ã‘ãŸã®ã§ã™ãŒã€
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features
ã‚れã€compile()ã¯éžæŽ¨å¥¨ãªã®ã§ã™ã。ã¨ã„ã†ã“ã¨ã¯ã€ã‚„ã£ã±ã‚Šå‡¦ç†ç³»ãŒæœ€é©åŒ–ã®éŽç¨‹ã§ã‚³ãƒ³ãƒ‘イルã—ã¦ã„ãã®ãŒç‹ã¨ã„ã†ã“ã¨ã§ã™ã。
éžæŽ¨å¥¨ã®compile()を使ã†ã¨ãれを強制的ã«å‹•ã‹ã›ã‚‹ã®ã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚³ãƒ¼ãƒ‰ã®å ´åˆã¯æœ‰åˆ©ã¨ã„ã£ãŸã¨ã“ã‚ã§ã—ょã†ã‹ã€‚
ã¨ã„ã†ã‚ã‘ã§çµè«–ã¯ã€ã‚ˆã»ã©ã®ç†ç”±ãŒãªã‘れã°ã€inline型を使ã£ã¦ãŠã‘ã°ã‚ˆã„ã§ã—ょã†ã€‚new RegExp()
を使ã£ã¦ã‚‚ãƒ‘ãƒ•ã‚©ãƒ¼ãƒžãƒ³ã‚¹ãŒæ‚ªããªã‚‹ã‚ã‘ã§ã¯ãªã„ã®ã§ã€å ´åˆã«ã‚ˆã£ã¦ã¯ä½¿ã£ã¦ã‚‚よã„ã§ã—ょã†ã€‚
ãã‚‹ã£ã¨å›žã£ã¦æŒ¯ã‚Šå‡ºã—ã«æˆ»ã£ãŸæ„Ÿã˜ã§ã™ãŒã€å€‹äººçš„ã«ã¯ã™ã£ãりã—ã¾ã—ãŸã€‚