Fix for a selector speed regression (calling a simple selector many times resulted in a significant speed down). This has been fixed by breaking the RegExps out into the global scope. This required that a closure be implemented around the full jQuery script (which is now the case). Some simple changes were made in addition to the RegExp one, allowing for some greater flexibility on our part - and hopefully better compression.

Speed results:
http://dev.jquery.com/~john/ticket/1351/ vs.
http://dev.jquery.com/~john/ticket/1351/113.html vs.
http://dev.jquery.com/~john/ticket/1351/112.html
This commit is contained in:
John Resig 2007-08-21 05:43:44 +00:00
parent 8c15e852a4
commit b6d920cf05
5 changed files with 39 additions and 38 deletions

View file

@ -1,3 +1,11 @@
var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
"(?:[\\w*_-]|\\\\.)" :
"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
quickChild = new RegExp("^[/>]\\s*(" + chars + "+)"),
quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
quickClass = new RegExp("^([#.]?)(" + chars + "*)");
jQuery.extend({
expr: {
"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
@ -62,8 +70,7 @@ jQuery.extend({
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
// Match: :even, :last-chlid, #id, .class
new RegExp("^([:.#]*)(" +
( jQuery.chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? "(?:[\\w*_-]|\\\\.)" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)")
new RegExp("^([:.#]*)(" + chars + "+)")
],
multiFilter: function( expr, elems, not ) {
@ -125,7 +132,7 @@ jQuery.extend({
// An attempt at speeding up child selectors that
// point to a specific element tag
var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)");
var re = quickChild;
var m = re.exec(t);
if ( m ) {
@ -194,7 +201,7 @@ jQuery.extend({
} else {
// Optimize for the case nodeName#idName
var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)");
var re2 = quickID;
var m = re2.exec(t);
// Re-organize the results, so that they're consistent
@ -204,7 +211,7 @@ jQuery.extend({
} else {
// Otherwise, do a traditional filter check for
// ID, class, and element selectors
re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)");
re2 = quickClass;
m = re2.exec(t);
}