Signum Function (all)

JavaScript performance comparison

Revision 10 of this test case created

Info

Derived from this question on StackOverflow: Number.sign() in JavaScript

Versions of the test: test everythingonly numbersonly integers

Which approach do you think is the best?
Vote on the answers!

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    // OUR TEST CODE (see other versions)
    function test(sign) {
      sign(1)                  // +1
      sign(1908235)            // +1
      sign(-.1e-1)             // -1
      sign(Math.random()*2-1)  // ??
      sign(0)                  //  0
      sign(0.00000)            //  0
      sign(+Infinity)          // +1
      sign(-Infinity)          // -1
      sign(NaN)                //  0 or NaN
   
      // other types
      sign("0")
      sign("")
      sign([])
      sign("+23")
      sign(null)
      sign(undefined)
    }
   
   
    // 1. Obvious and fast
    function sign1 (x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
   
    // 1.1 Modification from kbec - one type cast less, more performant, shorter
    function sign1b(x) { return x ? x < 0 ? -1 : 1 : 0; }
   
    // 2. Elegant, short, not so fast
    function sign2 (x) { return x && x / Math.abs(x); }
    // (some issues with several cases, see answer.)
   
    // 3. The art... but very slow
    function sign3 (x) { return (x > 0) - (x < 0); }
   
    // 4. Using bit-shift
    function sign4(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
   
    // 5. Type-safe:
    function sign5 (x) {
            return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
    }
   
    // 1.1 Modification from kbec + type-safe
    function sign5b(x) { return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : 0 : NaN; }
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
1. Obvious
test(sign1)
pending…
1.1. Not So Obvious
test(sign1b)
pending…
2. Elegant
test(sign2)
pending…
3. Artistic
test(sign3)
pending…
4. Bit-shift
test(sign4)
pending…
5. Safe
test(sign5)
pending…
5.1. Safe + Not So Obvious
test(sign5b)
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment