RegExp#test + parseInt vs RegExp#exec + plus operator

CSSValue な "12em" や "123px" から 単位がpx の場合に 123 という数値を素早く取り出すには、

  1. RegExp#test でテストしてから parseInt で取り出す
  2. RegExp#exec してから +(matchedValue) で数値として取り出す

のどちらが効率的なのか気になったのでベンチマークとってみました。

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>