2012-01-31 5 views
4

Je suis en train de traiter un fichier XML dont les performances sont très lentes lors de la sélection de nœuds avec des sélecteurs de style XPath.jQuery - Amélioration des performances du sélecteur lors du traitement XML

Voici une partie du code qui fonctionne particularily lent

for (i=0;i<lanes.length;i++) 
    htmlContents += GetLaneInfo($(this).find("Lane[num='"+lanes[i]+"']").attr('avg')); 

Je crois que la partie la plus lente de ce code est le sélecteur Lane[num=X], comment puis-je améliorer les performances de ce? Puis-je mettre en cache $(this).find("Lanes"), puis les rechercher plus tard?

XML Exemple:

<Data time="10:50"> 
    <Lane num="102" avg="2.0"/> 
    <Lane num="103" avg="2.0"/> 
    <Lane num="104" avg="2.0"/> 
    <Lane num="112" avg="2.0"/> 
    <Lane num="113" avg="2.0"/> 
    <Lane num="114" avg="2.0"/> 
    <Lane num="115" avg="2.0"/> 
    <Lane num="122" avg="0.9"/> 
    <Lane num="123" avg="1.0"/> 
    <Lane num="124" avg="1.0"/> 
    <Lane num="132" avg="0.7"/> 
    <Lane num="134" avg="0.7"/> 
    <Lane num="142" avg="0.8"/> 
    <Lane num="153" avg="0.4"/> 
    <Lane num="154" avg="0.6"/> 
</Data> 
+1

vous pouvez le faire en javascript qui est le plus rapide :) –

+0

télécharger le échantillon xml –

+0

@ Royi Comment puis-je faire cela (facilement/plus rapidement) dans JS? En outre, mis à jour avec l'exemple XML. – Chris

Répondre

2

essayez ceci:

http://jsperf.com/1f

J'ai réussi à augmenter la vitesse. enter image description here

p.s. il est basé sur le fait que toutes les voies sont dans le même ordre dans chaque nœud xml.

+0

Cela fonctionnerait bien mais, toutes les voies ne sont pas toujours présentes dans le XML, il peut y avoir des lacunes, c'est-à-dire 1,2,3,6,7,8 etc. ce scénario le fera-t-il? – Chris

+1

@chris puis-je écrire une réponse demain? Je vais le réparer et vous envoyer un message. –

+0

@Chris et non - cela ne fonctionnera pas –

1

L'utilisation de l'analyse XML pour un tel balisage simple est une perte. Si vous voulez la vitesse en utilisant indexOf et sous-chaîne est la méthode supérieure.

http://jsperf.com/1f/2

J'ai effectué jsperf de @Royi Namir et a ajouté ma propre version (bien nommée "xml vis"). Il s'exécute 2x plus vite que sa version d'analyse XML optimisée.

Voici le code qui s'alignerait avec l'exemple de l'OP de la question. La variable "xml" est juste une chaîne qui représente le XML.

var find = ''; 
var start = -1; 
var end = -1; 
var skip1 = 0; 
var skip2 = ' avg="'.length; 
// 
for (i=0;i<lanes.length;i++) { 
    find = 'num="' + lanes[i] + '"'; 
    skip1 = find.length; 
    end = -1; 
    start = xml.indexOf(find, 0); 
    while (start != -1) { 
    start = start + skip1 + skip2; 
    end = xml.indexOf("\"/>", start); 
    htmlContents += GetLaneInfo(xml.substring(start, end)); 
    start = xml.indexOf(find, end); 
    } 
} 

En réalité, vous ne voulez probablement pas d'utiliser une version comme celle-ci parce qu'elle repose sur le XML étant uniformément formaté (voir: variable « DÉCAL2 »/constant). Mais si vous voulez vraiment que la performance/vitesse le fasse de cette façon, c'est de loin le plus rapide.

Questions connexes