Should improve performance of closest considerably. Benchmark proof in speed/closest...
authorwycats <wycats@gmail.com>
Sun, 10 Oct 2010 04:33:02 +0000 (21:33 -0700)
committerwycats <wycats@gmail.com>
Sun, 10 Oct 2010 04:33:02 +0000 (21:33 -0700)
speed/benchmark.js
speed/closest.html [new file with mode: 0644]
src/traversing.js

index 8f1aa98..50d5cad 100644 (file)
@@ -1,9 +1,15 @@
 // Runs a function many times without the function call overhead
-function benchmark(fn, times){
+function benchmark(fn, times, name){
        fn = fn.toString();
        var s = fn.indexOf('{')+1,
                e = fn.lastIndexOf('}');
        fn = fn.substring(s,e);
        
-       return new Function('i','var t=new Date;while(i--){'+fn+'};return new Date-t')(times);
+  return benchmarkString(fn, times, name);
+}
+
+function benchmarkString(fn, times, name) {
+  var fn = new Function("i", "var t=new Date; while(i--) {" + fn + "}; return new Date - t")(times)
+  fn.displayName = name || "benchmarked";
+  return fn;
 }
diff --git a/speed/closest.html b/speed/closest.html
new file mode 100644 (file)
index 0000000..eacf749
--- /dev/null
@@ -0,0 +1,35 @@
+<!doctype html>
+<html>
+<head>
+       <title>Test Event Handling Performance</title>
+       <script src="benchmark.js"></script>
+       <script src="jquery-basis.js"></script>
+       <script>var old = jQuery.noConflict(true);</script>
+       <script src="../dist/jquery.js"></script>
+  <script>
+    jQuery(function ready() {
+      var node = $("#child"), name;
+
+      [".zoo", "#zoo", "[data-foo=zoo]", "#nonexistant"].forEach(function foreach(item) {
+        name = "closest '" + item + "'";
+        console.log(name);
+
+        console.log("new", benchmarkString("$('#child').closest('" + item + "')", 5000, name));
+        console.log("old", benchmarkString("old('#child').closest('" + item + "')", 5000, name));
+      });
+    });
+       </script>
+</head>
+<body>
+  <div>
+    <p>Hello</p>
+    <div class="zoo" id="zoo" data-foo="bar">
+      <div>
+        <p id="child">lorem ipsum</p>
+        <p>dolor sit amet</p>
+      </div>
+    </div>
+  </div>
+</body>
+</html>
+
index f57819d..1633e2e 100644 (file)
@@ -8,6 +8,8 @@ var runtil = /Until$/,
        isSimple = /^.[^:#\[\.,]*$/,
        slice = Array.prototype.slice;
 
+var POS = jQuery.expr.match.POS;
+
 jQuery.fn.extend({
        find: function( selector ) {
                // Handle "> div" child selectors and pass them to .children()
@@ -95,21 +97,27 @@ jQuery.fn.extend({
                        return ret;
                }
 
-               var pos = jQuery.expr.match.POS.test( selectors ) ? 
+               var pos = POS.test( selectors ) ? 
                        jQuery( selectors, context || this.context ) : null;
 
-               ret = jQuery.map(this.get(),function( cur,i ) {
-                       while ( cur && cur.ownerDocument && cur !== context ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
-                                       return cur;
-                               }
+    var ret = [];
 
-                               cur = cur.parentNode;
-                       }
+    for ( var i=0,j=this.length; i<j; i++ ) {
+      var cur = this[i];
+
+      while ( cur ) {
+        if ( pos ? pos.index(cur) > -1 : jQuery.find.matches(selectors, [cur]).length ) {
+                                       ret.push( cur );
+          break;
+                               } else {
+          cur = cur.parentNode;
+          if ( !cur.ownerDocument || cur === context ) {
+            break;
+          }
+        }
+      }
+    }
 
-                       return null;
-               });
-               
                ret = ret.length > 1 ? jQuery.unique(ret) : ret;
                
                return this.pushStack( ret, "closest", selectors );