2010-08-26 3 views
1

J'ai suivi le slugishness dans mon application pour le bit de code qui est chronométré ci-dessous. Je savais que ce serait un point lent mais chaque requête prend en moyenne 1 seconde. Le bit de xml que je recherche est toujours dans le premier tag, donc je ne pense pas que ce soit le temps de téléchargement qui m'amène.Performances du lecteur XML

Stopwatch stopwatch = new Stopwatch(); 
XmlTextReader reader = new XmlTextReader("http://steamcommunity.com/id/test?xml=1"); 

stopwatch.Reset(); 
stopwatch.Start(); 

while (reader.Read()) { 
if (reader.Name.Equals("steamID64")) { 
    reader.Read(); 

    stopwatch.Stop(); 

    time = stopwatch.ElapsedMilliseconds(); 
    return Convert.ToInt64(reader.Value); 
} 
} 

Y at-il un moyen plus rapide de lire l'étiquette que je veux ou suis-je limité par le serveur je télécharge les fichiers XML à partir?

Merci.

+0

Essayez l'objet XPathNavigator - http://msdn.microsoft.com/fr-fr/library/system.xml.xpath.xpathnavigator.aspx –

+1

XmlTextReader est un objet jetable. –

+1

@Yuriy, vous voulez utiliser lecteur.close()? Je fais cela, je ne l'ai pas inclus dans l'extrait ci-dessus. – Radu

Répondre

1

donc je ne pense pas que ce soit le temps de téléchargement qui me reçoivent

Pour confirmer Avez-vous envisagé de télécharger le fichier en local, puis voir ce que le Les temps sont comme

+1

Non, essayant maintenant. Merci pour la suggestion! – Radu

+0

Est descendu de 1000ms à 1ms. Je suppose que je suis foutu. Je ne peux pas croire que je n'ai pas pensé à tester ça - merci! – Radu

3

Je pense que vous mesurez le temps qu'il faut pour créer une connexion. Pour confirmer cela, vous pouvez déplacer les lignes Reset + Start au-dessus de la création du lecteur. Je m'attends à ce qu'il y ait peu ou pas de différence.

Si c'est l'heure de connexion, c'est au réseau et il est noté que vous pouvez faire dans votre code. Peut-être que vous pouvez obtenir une amélioration de tweeking vos paramètres réseau. Mais c'est pour un autre forum.

+0

J'ai déplacé le chronomètre pour entourer la déclaration du lecteur et il se lit 0. – Radu

+1

Je considère cette confirmation. Il figure, XmlReader est le moyen le plus rapide de lire Xml. C'est un problème d'E/S. –

+2

Ainsi, la connexion ne se fait pas tant que vous n'avez pas lu Read() '- alors vous allez souffrir d'une prise de contact TCP suivie d'un démarrage lent TCP. Si vous souhaitez extraire le flux plusieurs fois pendant la durée de vie de l'application, vérifiez si vous pouvez conserver une connexion HTTP persistante ouverte au serveur. – snemarch

1

Essayez le réglage

reader.XmlResolver = null; 
+0

Cela ne semble pas aider, mais j'ai probablement besoin de faire beaucoup d'itérations pour m'assurer. – Radu

1

J'ai comparé votre méthode avec une méthode différente. Téléchargez simplement les données et trouvez l'identifiant par expression régulière.

 System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); 
     stopwatch.Reset(); 
     stopwatch.Start(); 

     System.Net.WebClient wc = new System.Net.WebClient(); 
     string s = wc.DownloadString("http://steamcommunity.com/id/test?xml=1"); 
     System.Text.RegularExpressions.Regex re = new Regex("\\<steamID64\\>(\\d+)\\</steamID64\\>"); 
     System.Text.RegularExpressions.Match m = re.Match(s); 
     if (m != null && m.Captures.Count != 0) Response.Write("steamID64: " + m.Captures[0].Value + " <br/>"); 
     stopwatch.Stop(); 

     long time = stopwatch.ElapsedMilliseconds; 
     Response.Write("Time Elapsed (1):" + time.ToString() +" <br/>"); 

     stopwatch.Reset(); 
     stopwatch.Start(); 

     System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader("http://steamcommunity.com/id/test?xml=1"); 

     stopwatch.Reset(); 
     stopwatch.Start(); 

     while (reader.Read()) 
     { 
      if (reader.Name.Equals("steamID64")) 
      { 
       reader.Read(); 
       stopwatch.Stop(); 

       time = stopwatch.ElapsedMilliseconds; 
       s = reader.Value; 
       break; 
      } 
     } 

     Response.Write("<br/>steamID64: " + s); 
     Response.Write("<br/>Time Elapsed (2):" + time.ToString() + " <br/>"); 

** Résultat:

steamID64: 76561197991558078 Temps écoulé (1): 1572

steamID64: 76561197991558078 Temps écoulé (2): 969

XmlReader est mieux :) .

Questions connexes