RegExp#test + parseInt vs RegExp#exec + plus operator
CSSValue な "12em" や "123px" から 単位がpx の場合に 123 という数値を素早く取り出すには、
のどちらが効率的なのか気になったのでベンチマークとってみました。
RegExp#test() + parseInt() |
RegExp#exec() + parseInt() |
RegExp#exec() + plus operator |
loops | |
IE9pp7 | 861 | 2134 | 2072 | 100 |
---|---|---|---|---|
IE8 | 410 | 917 | 860 | 10 |
GC9 | 410 | 564 | 445 | 100 |
Op11 | 670 | 803 | 726 | 100 |
Fx40β10 | 337 | 1488 | 1566 | 100 |
iPhone3GS (iOS4.2) |
138 | 333 | 344 | 1 |
HTC Desire HD (OS2.2) |
48 | 78 | 52 | 1 |
RegExp#test() してから parseInt すると良いようです。
jsdo.it で試せます http://jsdo.it/uupaa/6LQq
<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8" /> <title>bench: RegExp#test + parseInt vs RegExp#exec + plus operator</title> <style>th,td { padding: 5px; text-align: right }</style> <script src="bench.js"></script><script> /* RegExp#test() + parseInt() vs RegExp#exec() + plus operator */ window.onload = function() { document.body.innerHTML += "<p>" + navigator.userAgent + "</p>Running..."; var loop = getLoop(); // --------------------------------------------------------- var rex1 = /\d+px$/, rex2 = /(\d+)px$/; function _test(idx) { var patt = idx + "px"; if (rex1.test(patt)) { return parseInt(patt); } return idx; } function _exec(idx) { var patt = idx + "px"; var match = rex2.exec(patt); if (match) { return parseInt(match[1]); } return idx; } function _exec2(idx) { var patt = idx + "px"; var match = rex2.exec(patt); if (match) { return +match[1]; } return idx; } var arg; job(5, loop, ["RegExp#test() + parseInt()", _test, "RegExp#exec() + parseInt()", _exec, "RegExp#exec() + plus operator", _exec2, "RegExp#exec() + parseInt()", _exec]); } </script></head><body></body></html>