mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Should improve performance of closest considerably. Benchmark proof in speed/closest.html
This commit is contained in:
parent
cbf9d874e5
commit
0ca35de311
@ -1,9 +1,15 @@
|
|||||||
// Runs a function many times without the function call overhead
|
// Runs a function many times without the function call overhead
|
||||||
function benchmark(fn, times){
|
function benchmark(fn, times, name){
|
||||||
fn = fn.toString();
|
fn = fn.toString();
|
||||||
var s = fn.indexOf('{')+1,
|
var s = fn.indexOf('{')+1,
|
||||||
e = fn.lastIndexOf('}');
|
e = fn.lastIndexOf('}');
|
||||||
fn = fn.substring(s,e);
|
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;
|
||||||
}
|
}
|
||||||
|
35
speed/closest.html
Normal file
35
speed/closest.html
Normal file
@ -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>
|
||||||
|
|
@ -8,6 +8,8 @@ var runtil = /Until$/,
|
|||||||
isSimple = /^.[^:#\[\.,]*$/,
|
isSimple = /^.[^:#\[\.,]*$/,
|
||||||
slice = Array.prototype.slice;
|
slice = Array.prototype.slice;
|
||||||
|
|
||||||
|
var POS = jQuery.expr.match.POS;
|
||||||
|
|
||||||
jQuery.fn.extend({
|
jQuery.fn.extend({
|
||||||
find: function( selector ) {
|
find: function( selector ) {
|
||||||
// Handle "> div" child selectors and pass them to .children()
|
// Handle "> div" child selectors and pass them to .children()
|
||||||
@ -95,20 +97,26 @@ jQuery.fn.extend({
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pos = jQuery.expr.match.POS.test( selectors ) ?
|
var pos = POS.test( selectors ) ?
|
||||||
jQuery( selectors, context || this.context ) : null;
|
jQuery( selectors, context || this.context ) : null;
|
||||||
|
|
||||||
ret = jQuery.map(this.get(),function( cur,i ) {
|
var ret = [];
|
||||||
while ( cur && cur.ownerDocument && cur !== context ) {
|
|
||||||
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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;
|
cur = cur.parentNode;
|
||||||
|
if ( !cur.ownerDocument || cur === context ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
|
|
||||||
ret = ret.length > 1 ? jQuery.unique(ret) : ret;
|
ret = ret.length > 1 ? jQuery.unique(ret) : ret;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user