Signum Function (numbers)

JavaScript performance comparison

Revision 2 of this test case created by C5H8NNaO4

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
    }
   
   
    // 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. Type-safe:
    function sign4 (x) {
        return typeof x == 'number' ? x ? x < 0 ? -1 : 1 : isNaN(x) ? NaN : 0 : NaN;
    }
   
    // 5. The straightforward way
   
    function sign5(x) {
      if (x !== x ) {
          return 0;
       }
       if ( 0 === x ) {
          return 0;
       }
       if (  0 < x  ) {
         return 1;
       }
       return -1;
     }
};
</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
      sign1(1)                  // +1
      sign1(1908235)            // +1
      sign1(-.1e-1)             // -1
      sign1(Math.random()*2-1)  // ??
      sign1(0)                  //  0
      sign1(0.00000)            //  0
      sign1(+Infinity)          // +1
      sign1(-Infinity)          // -1
      sign1(NaN)                //  0 or NaN
pending…
1.1. Not So Obvious
      sign1b(1)                  // +1
      sign1b(1908235)            // +1
      sign1b(-.1e-1)             // -1
      sign1b(Math.random()*2-1)  // ??
      sign1b(0)                  //  0
      sign1b(0.00000)            //  0
      sign1b(+Infinity)          // +1
      sign1b(-Infinity)          // -1
      sign1b(NaN)                //  0 or NaN
pending…
2. Elegant
      sign2(1)                  // +1
      sign2(1908235)            // +1
      sign2(-.1e-1)             // -1
      sign2(Math.random()*2-1)  // ??
      sign2(0)                  //  0
      sign2(0.00000)            //  0
      sign2(+Infinity)          // +1
      sign2(-Infinity)          // -1
      sign2(NaN)                //  0 or NaN
pending…
3. Artistic
      sign3(1)                  // +1
      sign3(1908235)            // +1
      sign3(-.1e-1)             // -1
      sign3(Math.random()*2-1)  // ??
      sign3(0)                  //  0
      sign3(0.00000)            //  0
      sign3(+Infinity)          // +1
      sign3(-Infinity)          // -1
      sign3(NaN)                //  0 or NaN
pending…
4. Safe
      sign4(1)                  // +1
      sign4(1908235)            // +1
      sign4(-.1e-1)             // -1
      sign4(Math.random()*2-1)  // ??
      sign4(0)                  //  0
      sign4(0.00000)            //  0
      sign4(+Infinity)          // +1
      sign4(-Infinity)          // -1
      sign4(NaN)                //  0 or NaN
pending…
5. Straightforward
      sign5(1)                  // +1
      sign5(1908235)            // +1
      sign5(-.1e-1)             // -1
      sign5(Math.random()*2-1)  // ??
      sign5(0)                  //  0
      sign5(0.00000)            //  0
      sign5(+Infinity)          // +1
      sign5(-Infinity)          // -1
      sign5(NaN)                //  0 or NaN
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