// 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;
}
--- /dev/null
+<!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>
+
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()
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 );