2009-09-09 5 views
1

Quand je courais le profileur sur une page intensive JQuery lors de l'accord pour la performance, je remarquai que ces fonctions JQuery prennent beaucoup de temps (dans cet ordre)JQuery dir, grésillement et le filtre

dir (9.42%) 
Sizzle (3.79%) 
filter (3.79%) 

Mes fonctions jquery sont trop grands pour coller ici. Puis-je obtenir des pointeurs sur les fonctions JQuery appelées en interne ces fonctions?

De même, existe-t-il un moyen d'obtenir un arbre de fonctions JS en utilisant le profileur IE8 (ou de toute autre manière) qui me dit quelle fonction JS a appelé laquelle?

Merci

Répondre

2

La plupart des internes de jQuery sont des fonctions privées, anonymes. Je ne vois pas comment vous pouvez le profiler. (J'ai essayé aussi, sans chance).

Sizzle est le selector-engine alimentant jQuery. Et je soupçonne que Sizzle utilise beaucoup filter() lors de l'interrogation du DOM, en utilisant des sélecteurs plus complexes. Ainsi, au moins, ces appels de fonction sont «ok» et fonctionnent comme prévu, et sont optimisés autant que possible, en termes de vitesse.


Mise à jour:

Ceci est la mise en œuvre de la fonction dir():

jQuery.dir = function(elem, dir){ 
    var matched = [], cur = elem[dir]; 
    while (cur && cur != document) { 
     if (cur.nodeType == 1) 
      matched.push(cur); 
     cur = cur[dir]; 
    } 
    return matched; 
}; 

nodeType 1 est un ELEMENT_NODE. Les filtres de fonction dir() (ou "assainit" est vous) l'ensemble de résultats d'une requête donnée, pour s'assurer que seuls les éléments DOM sont retournés, et non les attributs, les nœuds de texte et ainsi de suite. (Météo dir() est exécuté, est probablement déterminé par Sizzle).


Pour conclure:

Vous ne pouvez pas sauter une de ces fonctions, car ils sont au cœur d'être réellement en mesure d'obtenir une prise de quoi que ce soit dans les DOM. (Faire une requête). Chaque fois que vous interrogez le DOM ($("#something")), ces fonctions sont exécutées. Sur les requêtes simples, peut-être qu'une ou deux des trois fonctions seront exécutées. C'est probablement la raison pour laquelle il existe des variations dans le nombre d'appels. Comme le montre Chetan Sastry: Vous pouvez gagner beaucoup de performance en mettant en cache vos requêtes et ainsi de suite. Jetez un oeil à this post pour quelques astuces jQuery propres.

+0

J'essaie de voir si je peux ignorer l'appel de la fonction JQuery qui appelle ces fonctions JQuery en interne. Je suis incapable d'identifier quelle fonction JQuery dans mon script déclenche ces appels. – Nick

+1

@unknown: Pratiquement tous les sélecteurs jQuery utilisent une ou toutes ces fonctions. Éliminez autant que possible les sélecteurs (résultats du cache) et vous devriez voir un gain de performance. –

Questions connexes