Exotic add function in JavaScript

JavaScript performance comparison

Test case created by Jeroen

Info

Comparison between add functions. View the gist here

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    function add_normal() {
      // Start from zero
      var total = 0;
   
      // Floating-points, bah!
      // 1e12 = 1000000000000.
      var factor = 1e12;
   
      // Undefined, set in the loop
      var value;
   
      // Something to iterate on
      var i = arguments.length;
   
      // Loop through all the parameters
      while (i--) {
        // Multiply by 1e12, to account for peculiarities
        // of doing addition with floating-point numbers.
        value = parseFloat(arguments[i]) * factor;
   
        // Is it not, not a number?
        // Then hey, it's a number!
        if (!isNaN(value)) {
           total += value;
        }
      }
   
      // Divide back by 1e12, because we multiplied by
      // 1e12 to account for floating-point weirdness.
      return total/factor;
    }
   
    // can you figure it?
    function add_exotic() {
      var args = [].slice.call(arguments), total = 0;
         
      for (;args.length; args.shift()) {
        !args[0] || typeof args[0] === 'boolean' || (total += parseFloat( !(args[0]*1) ? 0 : args[0] ) * 1e12);
      }
         
      return total/1e12;
    }
   
};
</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
Add normal
// Should equal 15
add_normal(1, 2, 3, 4, 5);

// Should equal 0
add_normal(5, null, -5);

// Should equal 10
add_normal('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1);

// Should equal 0.3, not 0.30000000000000004
add_normal(0.1, 0.2);
pending…
Add exotic
// Should equal 15
add_exotic(1, 2, 3, 4, 5);

// Should equal 0
add_exotic(5, null, -5);

// Should equal 10
add_exotic('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1);

// Should equal 0.3, not 0.30000000000000004
add_exotic(0.1, 0.2);
pending…

You can edit these tests or add even more tests to this page by appending /edit to the URL.

Compare results of other browsers

0 comments

Add a comment