jQuery 1.4.3 perf degrade (v5)

Revision 5 of this benchmark created by Charles McNulty on


Preparation HTML

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>var a = jQuery.noConflict();</script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
<script>var b = jQuery.noConflict();</script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
<script>

(function($) {

 if ("sourceIndex" in document.documentElement) {

  var baseHasDuplicate = true,
      sortOrder = null;

  // Here we check if the JavaScript engine is using some sort of
  // optimization where it does not always call our comparision
  // function. If that is the case, discard the hasDuplicate value.
  //   Thus far that includes Google Chrome.
  [0, 0].sort(function() {
   baseHasDuplicate = false;
   return 0;
  });

  sortOrder = function(a, b) {
   if (!a.sourceIndex || !b.sourceIndex) {
    if (a == b) {
     hasDuplicate = true;
    }
    return a.sourceIndex ? -1 : 1;
   }

   var ret = a.sourceIndex - b.sourceIndex;
   if (ret === 0) {
    hasDuplicate = true;
   }
   return ret;
  };

  $.unique = function(results) {
   if (sortOrder) {
    hasDuplicate = baseHasDuplicate;
    results.sort(sortOrder);

    if (hasDuplicate) {
     for (var i = 1; i < results.length; i++) {
      if (results[i] === results[i - 1]) {
       results.splice(i--, 1);
      }
     }
    }
   }

   return results;
  };
 }
})(jQuery);


var c = jQuery.noConflict();</script>

<style>
.test {
   display: none; 
}
</style>

<div id="items">  
</div>

<script>
  var amt = 50,
      $jq_142 = a('#items'),
      $jq_16 = b('#items'),
      $jq_16_with_fix = c('#items'),
      elems = [];
  
  for (var i = 0; i < amt; i++) {
   elems.push('<ul class="test"><li class="test">foo</li></ul>');
   elems.push('<div class="test">hmm</div>');
   elems.push('<input class="test" type="hidden" name="hoo' + i + '" /> ')
   elems.push('<select class="test"><option value="1">foo</option></select>')
  }
  
  $jq_142.html(elems.join(""));
  $jq_16.html(elems.join(""));
  $jq_16_with_fix.html(elems.join(""));
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
version 1.4.2
$jq_142.find('li').add('#items');
ready
version 1.6
$jq_16.find('li').add('#items');
ready
1.6 with fix
$jq_16_with_fix.find('li').add('#items');
ready

Revisions

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

  • Revision 1: published by Charles McNulty on
  • Revision 4: published by Charles McNulty on
  • Revision 5: published by Charles McNulty on
  • Revision 6: published by Volker Mische on
  • Revision 7: published on