Unrolled Max (v2)

Revision 2 of this benchmark created by Brian Ford on


Description

Test loop unrolling techniques, such as Duff's Device implemented in JavaScript for a function to find the max value of an array.

Preparation HTML

<script>
  var data = (function() {
  
    var arr = [],
        i;
  
    for (i = 0; i < 10000; i += 1) {
      arr.push(Math.random());
    }
  
    return arr;
  }());
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Rolled
var i, max = 0,
    len = data.length;

for (i = 0; i < len; i += 1) {
  if (data[i] > max) {
    max = data[i];
  }
}
ready
Unrolled
var i, max = 0,
    len = data.length;

for (i = 0; i < len; i += 10) {
  if (data[i] > max) {
    max = data[i];
  }
  if (data[i + 1] > max) {
    max = data[i + 1];
  }
  if (data[i + 2] > max) {
    max = data[i + 2];
  }
  if (data[i + 3] > max) {
    max = data[i + 3];
  }
  if (data[i + 4] > max) {
    max = data[i + 4];
  }
  if (data[i + 5] > max) {
    max = data[i + 5];
  }
  if (data[i + 6] > max) {
    max = data[i + 6];
  }
  if (data[i + 7] > max) {
    max = data[i + 7];
  }
  if (data[i + 8] > max) {
    max = data[i + 8];
  }
  if (data[i + 9] > max) {
    max = data[i + 9];
  }
}
ready
Duff-style
var duffForEach = function(arr, f) {
    var len = arr.length,
        pos = 0;

    while (pos < len) {
      switch (pos % 10) {
      case 0:
        f(arr[pos]);
        pos++;
      case 9:
        f(arr[pos]);
        pos++;
      case 8:
        f(arr[pos]);
        pos++;
      case 7:
        f(arr[pos]);
        pos++;
      case 6:
        f(arr[pos]);
        pos++;
      case 5:
        f(arr[pos]);
        pos++;
      case 4:
        f(arr[pos]);
        pos++;
      case 3:
        f(arr[pos]);
        pos++;
      case 2:
        f(arr[pos]);
        pos++;
      case 1:
        f(arr[pos]);
        pos++;
      }
    }
};

var max = 0;

duffForEach(data, function(item) {
  if (item > max) {
    max = item;
  }
});
ready
Improved Duff-style
var duffForEach2 = function(data, f) {
    var len = data.length,
        pos = 0;

  for (i = 0; i < len; i += 10) {
    f(data[i]);
    f(data[i + 1]);
    f(data[i + 2]);
    f(data[i + 3]);
    f(data[i + 4]);
    f(data[i + 5]);
    f(data[i + 6]);
    f(data[i + 7]);
    f(data[i + 8]);
    f(data[i + 9]);
  }
};

var max = 0;
duffForEach2(data, function(item) {
  if (item > max) {
    max = item;
  }
});
ready

Revisions

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