Skip to content

Commit

Permalink
Fix for a selector speed regression (calling a simple selector many t…
Browse files Browse the repository at this point in the history
…imes 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
  • Loading branch information
jeresig committed Aug 21, 2007
1 parent 8c15e85 commit b6d920c
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 39 deletions.
4 changes: 0 additions & 4 deletions src/event/event.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -578,8 +578,6 @@ jQuery.extend({
} }
}); });


new function(){

/** /**
* Bind a function to the scroll event of each matched element. * Bind a function to the scroll event of each matched element.
* *
Expand Down Expand Up @@ -976,5 +974,3 @@ new function(){


// A fallback to window.onload, that will always work // A fallback to window.onload, that will always work
jQuery.event.add( window, "load", jQuery.ready ); jQuery.event.add( window, "load", jQuery.ready );

};
2 changes: 1 addition & 1 deletion src/intro.js
Original file line number Original file line Diff line number Diff line change
@@ -1,2 +1,2 @@
// prevent execution of jQuery if included more than once // prevent execution of jQuery if included more than once
if(typeof window.jQuery == "undefined") { if(typeof window.jQuery == "undefined") (function(){
54 changes: 26 additions & 28 deletions src/jquery/jquery.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@
* $Rev$ * $Rev$
*/ */


// Global undefined variable
window.undefined = window.undefined;

/** /**
* Create a new jQuery Object * Create a new jQuery Object
* *
Expand All @@ -22,7 +19,7 @@ window.undefined = window.undefined;
* @param jQuery|Element|Array<Element> c context * @param jQuery|Element|Array<Element> c context
* @cat Core * @cat Core
*/ */
var jQuery = function(a,c) { window.jQuery = function(a,c) {
// If the context is global, return a new object // If the context is global, return a new object
if ( window == this || !this.init ) if ( window == this || !this.init )
return new jQuery(a,c); return new jQuery(a,c);
Expand All @@ -35,7 +32,7 @@ if ( typeof $ != "undefined" )
jQuery._$ = $; jQuery._$ = $;


// Map the jQuery namespace to the '$' one // Map the jQuery namespace to the '$' one
var $ = jQuery; window.$ = jQuery;


/** /**
* This function accepts a string containing a CSS or * This function accepts a string containing a CSS or
Expand Down Expand Up @@ -1527,7 +1524,7 @@ jQuery.extend({
} }


if (prop.match(/float/i)) if (prop.match(/float/i))
prop = jQuery.styleFloat; prop = styleFloat;


if (!force && elem.style[prop]) if (!force && elem.style[prop])
ret = elem.style[prop]; ret = elem.style[prop];
Expand Down Expand Up @@ -1940,29 +1937,31 @@ jQuery.extend({
* @type Boolean * @type Boolean
* @cat JavaScript * @cat JavaScript
*/ */
new function() { var userAgent = navigator.userAgent.toLowerCase();
var b = navigator.userAgent.toLowerCase();

// Figure out what browser is being used
// Figure out what browser is being used jQuery.browser = {
jQuery.browser = { version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1], safari: /webkit/.test(userAgent),
safari: /webkit/.test(b), opera: /opera/.test(userAgent),
opera: /opera/.test(b), msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
msie: /msie/.test(b) && !/opera/.test(b), mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b) };
};


var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";

jQuery.extend({
// Check to see if the W3C box model is being used // Check to see if the W3C box model is being used
jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat"; boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",

jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat"; styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",

jQuery.props = { props: {
"for": "htmlFor", "for": "htmlFor",
"class": "className", "class": "className",
"float": jQuery.styleFloat, "float": styleFloat,
cssFloat: jQuery.styleFloat, cssFloat: styleFloat,
styleFloat: jQuery.styleFloat, styleFloat: styleFloat,
innerHTML: "innerHTML", innerHTML: "innerHTML",
className: "className", className: "className",
value: "value", value: "value",
Expand All @@ -1971,9 +1970,8 @@ new function() {
readonly: "readOnly", readonly: "readOnly",
selected: "selected", selected: "selected",
maxlength: "maxLength" maxlength: "maxLength"
}; }

});
};


/** /**
* Get a set of elements containing the unique parents of the matched * Get a set of elements containing the unique parents of the matched
Expand Down
2 changes: 1 addition & 1 deletion src/outro.js
Original file line number Original file line Diff line number Diff line change
@@ -1 +1 @@
} })();
17 changes: 12 additions & 5 deletions src/selector/selector.js
Original file line number Original file line Diff line number Diff line change
@@ -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({ jQuery.extend({
expr: { expr: {
"": "m[2]=='*'||jQuery.nodeName(a,m[2])", "": "m[2]=='*'||jQuery.nodeName(a,m[2])",
Expand Down Expand Up @@ -62,8 +70,7 @@ jQuery.extend({
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,


// Match: :even, :last-chlid, #id, .class // Match: :even, :last-chlid, #id, .class
new RegExp("^([:.#]*)(" + new RegExp("^([:.#]*)(" + chars + "+)")
( jQuery.chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? "(?:[\\w*_-]|\\\\.)" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)")
], ],


multiFilter: function( expr, elems, not ) { multiFilter: function( expr, elems, not ) {
Expand Down Expand Up @@ -125,7 +132,7 @@ jQuery.extend({


// An attempt at speeding up child selectors that // An attempt at speeding up child selectors that
// point to a specific element tag // point to a specific element tag
var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)"); var re = quickChild;
var m = re.exec(t); var m = re.exec(t);


if ( m ) { if ( m ) {
Expand Down Expand Up @@ -194,7 +201,7 @@ jQuery.extend({


} else { } else {
// Optimize for the case nodeName#idName // Optimize for the case nodeName#idName
var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)"); var re2 = quickID;
var m = re2.exec(t); var m = re2.exec(t);


// Re-organize the results, so that they're consistent // Re-organize the results, so that they're consistent
Expand All @@ -204,7 +211,7 @@ jQuery.extend({
} else { } else {
// Otherwise, do a traditional filter check for // Otherwise, do a traditional filter check for
// ID, class, and element selectors // ID, class, and element selectors
re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)"); re2 = quickClass;
m = re2.exec(t); m = re2.exec(t);
} }


Expand Down

0 comments on commit b6d920c

Please sign in to comment.