Higher Order Functions

Benchmark created by Jonas Westerlund on


Description

Testing some higher-order functions against their native counterparts. These are obviously not ECMAScript compliant. More info here.

Preparation HTML

<script>
  /**
   * Map a function over an Array (or Array-like object)
   * @param {function(*): *} f
   * @param {*} xs
   * @return {Array}
   */
  function map(f, xs) {
      var length = xs.length;
      var ys = [];
      var i = 0;
      while (i < length) {
          ys[i] = f(xs[i++]);
      }
      return ys;
  }
  
  /**
   * Filter an Array (or Array-like object)
   * @param {function(*):boolean} p
   * @param {*} xs
   * @return {Array}
   */
  function filter(p, xs) {
      var length = xs.length;
      var ys = [];
      var i = 0;
      var j = 0;
      while (j < length) {
          if (true === p(xs[j])) {
              ys[i++] = xs[j];
          }
          ++j;
      }
      return ys;
  }
  
  /**
   * Fold an array from the left
   * @param {function(*, *):*} f Combining function
   * @param {*} z Initial value
   * @param {*} xs
   * @return {*}
   */
  function foldl(f, z, xs) {
      var length = xs.length;
      var i = 0;
      while (i < length) {
          z = f(z, xs[i++]);
      }
      return z;
  }
  
  /**
   * Fold an array from the right
   * @param {function(...):*} f Combining function
   * @param {*} z Initial value
   * @param {*} xs An Array-like object
   * @return {*}
   */
  function foldr(f, z, xs) {
      var i = xs.length;
      while (i--) {
          z = f(xs[i], z);
      }
      return z;
  }
  
  // Some test data/functions
  var numbers = [0,1,2,3,4,5,6,7,8,9];
  var strings = ["0","1","2","3","4","5","6","7","8","9"];
  function add(a, b) { return a + b; }
  function add1(a) { return a + 1; }
  function lt5(a) { return a < 5; }
  
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
JS map
map(add1, numbers);
ready
Native map
numbers.map(add1);
ready
JS reduce
foldl(add, 0, numbers);
ready
Native reduce
numbers.reduce(add, 0);
ready
JS reduceRight
foldr(add, 0, numbers);
ready
Native reduceRight
numbers.reduceRight(add, 0);
ready
JS filter
filter(lt5, numbers);
ready
Native filter
numbers.filter(lt5);
ready

Revisions

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

  • Revision 1: published by Jonas Westerlund on