v8 generators vs promises vs callback (v6)

Revision 6 of this benchmark created by artem on


Description

Measuring native Chrome promises vs generators vs callbacks

Preparation HTML

<script 
src="http://jphpsf.github.io/setImmediate-shim-demo/setImmediate.js">
</script>

Setup

var large = 10;
    
    // factorial using native promises
    
    function valuePromise(n) {
      return new Promise(function(resolve) {
        return resolve(n);
      });
    }
    
    function factorialPromises(n) {
      var start = valuePromise(n);
      while (n -= 1) {
        start = start.then(function(n, value) {
          // console.log('n', n, 'value', value)
          return value * n;
        }.bind(null, n));
      }
      return start;
    }
    
    // factorial using generators
    
    function * Factorial() {
      var n = 1,
        total = 1;
      while (true) {
        total = total * n++;
        yield total;
      };
    }
    
    function factorial(n) {
      var f = Factorial(),
        k, nf;
      for (k = 0; k < n; k += 1) {
        nf = f.next().value;
      }
      return nf;
    }
    
    function factorial_callback(n, callback) {
      if (n <= 2)
        callback(1);
      else 
        factorial_callback(n - 1, function(res) {
          callback(n * res);
        });
    }
    function factorial_callback_setImmediate(n, callback) {
      if (n <= 2)
        callback(1);
      else 
        setImmediate(function() {
          factorial_callback(n - 1, function(res) {
            callback(n * res);
          });
        });
    }

Test runner

Ready to run.

Testing in
TestOps/sec
native Promise
// async test
factorialPromises(large).then(function() {
  deferred.resolve();
});
ready
generators
factorial(large);
ready
callbacks
// async test
factorial_callback(large, function(res) {1
  deferred.resolve();
});
ready
callbacks with setImmediate
// async test
factorial_callback_setImmediate(large, function(res) {
  deferred.resolve();
});
ready

Revisions

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