Recursion Comparison (v2)

Revision 2 of this benchmark created by David Atchley on


Setup

"use strict";
  
  function trampoline(fn){
      return function(/*args*/){
          var res = fn.apply(this, arguments);
          while(res instanceof Function){
              res = res();
          }
          return res;
      }
  }
  // Generate an array of numbers in a given range.
  // Tail Recursive implementation
  function _rangetr(s, e, res) {
    res = res || [];
    res.push(s);
    return s == e ? res : function() { return _rangetr(s<e ? ++s : --s, e, res); };
  }
  
  // Generate an array of numbers in a given range.
  // Tail Recursive implementation
  function rangetr(s, e, res) {
    res = res || [];
    res.push(s);
    return s == e ? res : rangetr(s<e ? ++s : --s, e, res);
  }
  
  // Generate an array of numbers in a given range.
  // Recursive implementation
  function ranger(s, e) {
    var res = [];
    
    res.push(s);
    return s == e ? res : res.concat(ranger(s<e ? ++s : --s, e));
  }
  
  // Generate an array of numbers in a given range.
  // Iterative implementation
  function range(s, e) {
      var res = [];
  
      while (s != e) {
          res.push(s);
          s < e ? s++ : s--;
      }
      res.push(s); 
      return res;
  }
  
  // Babel transpiled tail-call optimization
  function rangetr_babel(_x, _x2, _x3) {
    var _again = true;
  
    _function: while (_again) {
      var s = _x,
          e = _x2,
          res = _x3;
      _again = false;
  
      res = res || [];
      res.push(s);
      if (s == e) {
        return res;
      } else {
        _x = s < e ? ++s : --s;
        _x2 = e;
        _x3 = res;
        _again = true;
        continue _function;
      }
    }
  }

Test runner

Ready to run.

Testing in
TestOps/sec
Iteration
range(1,100);
ready
Recursion
ranger(1,100)
ready
Tail Recursive
rangetr(1,100);
ready
Tail Recursive w/ Trampoline
trampoline(_rangetr)(1,100)
ready
Babel Tail Call Optimized
rangetr_babel(1,100);
ready

Revisions

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

  • Revision 2: published by David Atchley on