jQuery array intersect vs native v7

JavaScript performance comparison

Revision 9 of this test case created

Info

BACKGROUND: http://phrogz.net/JS/classes/ExtendingJavaScriptObjectsAndClasses.html

MODIFIED: http://stackoverflow.com/questions/1266402/whats-a-good-mathematical-sets-implementation-in-javascript

Preparation code

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">
</script>
<script>
Benchmark.prototype.setup = function() {
    var alpha = [1, 2, 3, 4, 5, 6],
        beta = [4, 5, 6, 7, 8, 9],
        result = [];
};
</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
jQuery
$.arrayIntersect = function(a, b) {
  return $.grep(a, function(i) {
    return $.inArray(i, b) > -1;
  });
};

result = $.arrayIntersect(alpha, beta);
pending…
Native
function arrayIntersect(a, b) {
  return a.filter(function(i) {
    return b.indexOf(i) > -1;
  });
}

result = arrayIntersect(alpha, beta);
pending…
Native reduce
Array.prototype.intersect_safe = function(b) {
  var ai = 0,
      bi = 0;
  var result = new Array();

  while (ai < this.length && bi < b.length) {
    if (this[ai] < b[bi]) {
      ai++;
    } else if (this[ai] > b[bi]) {
      bi++;
    } else /* they're equal */
    {
      result.push(this[ai]);
      ai++;
      bi++;
    }
  }
  return result;
}
pending…
Object intersection
var myobject = new Object();

myobject.one = {
  'one': 10,
  'two': 20,
  'three': 30
};
myobject.two = {
  'three': 3,
  'four': 4,
  'five': 5
};

function intersect(s1, s2) {
  var i = new Array();
  for (var item in s1) {
    if (s1[item] && s2[item]) {
      i.push(item);
    }
  }
  return i;
}

result = intersect(myobject.one, myobject.two);
pending…
array vs hash
// CAVEAT: x & y must not contain only strings or numbers.
// CAVEAT2: cannot distinguish between strings and numbers.
function intersect (x, y) {

  if (y.length > x.length) {
    var t = x; x = y; y = t
  }
  // x >= y

  var h = {}
  for (var i = 0; i < x.length; i++) {
    var t = x[i]
    h[t] = true
  }

  var a = y.slice(0).sort()

  var z = []
  for (var i = 0, n = a.length; i < n; i++) {
    var t = a[i]
    if (h[t]) {
      z.push(t)
    }
  }
  return z
}

result = intersect(alpha, beta);
pending…
loop + indexof
Array.prototype.intersect2 = function(b){
  var result = new Array();
  var i = 0;
  var short = this.length < b.length = this : b;
  var long = this.length > b.length = this : b;
  while (i < short.length) {
    if (long.indexOf(short[i]) >= 0){
      result.push(short[
    }
    i++;
  }
  return result;
}

result = alpha.intersect2(beta);
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment