2009-10-15 6 views
1

J'ai une application C# dans laquelle je teste 3 façons de faire quelque chose avec XML. Je lis une chaîne de code XML et en retire une valeur puis l'ajoute à une collection personnalisée.Test de vitesse d'exécution de programme

Je suis en train de tester XMLDocument, XDocument et la manipulation de chaînes pour trouver la valeur du noeud, dans cet ordre en enregistrant une heure de début et de fin pour chacun. Cependant, si je dis mélanger la commande, j'obtiens différentes vitesses signalées. De même, lorsque j'appuie à nouveau sur le bouton pour effectuer à nouveau le test, celui qui était le plus lent au départ prend le moins de temps lors des tests suivants.

Je suis sûr que tout cela est lié à JIT et la collecte des ordures, mais quelle est la meilleure façon de déterminer ce qui fonctionne le plus vite.

J'ai téléchargé le profileur EQATEC mais je ne sais pas quoi faire avec. Est-ce que quelqu'un peut me conseiller la meilleure façon de déterminer quelles méthodes fonctionnent le plus rapidement?

Merci

Répondre

0

Essayez d'utiliser un outil de profilage comme ANTS de Red-Gate ou dotTrace de JetBrains. Les profileurs vous montreront quel pourcentage de temps est passé dans chaque méthode, ce qui vous permet d'identifier quelle est la méthode la plus rapide.

+1

Il doit être libre, j'en ai peur. – Jon

+1

Vous pouvez toujours utiliser la version d'essai? – Kane

1

Un autre profileur qui peut valoir la peine d'être essayé est Slimtune.

1

N'est-il pas suffisant pour chaque méthode avec un ensemble d'entrée d'échantillon tout en mesurant l'heure avec StopWatch?

+0

C'est ce que j'ai fait essentiellement cependant si je change l'exécution de traitement autour de ie/TestString, TestXdoc, TestXML le temps est différent si j'exécute TestXML, TestXDoc, TestString Pourquoi est-ce? – Jon

+0

avez-vous défaussé le premier résultat? – Simon

+0

Je suppose que la première méthode dans le plus lent? Vous devriez probablement lancer des tests séparés, comme 1000 fois TestXML avec des fichiers d'échantillons, puis calculer la moyenne. Répétez avec TestXDoc, puis avec TestString et comparez les résultats. – Philippe

0

Apprenez à utiliser les outils que vous avez:

http://www.eqatec.com/tools/profiler/guide

Si vous obtenez des résultats incohérents, faire la chose scientifique et faire des cas de contrôle:

  • deux tests plusieurs fois dans un boucle de sorte que le premier cas est en moyenne parmi le reste des exécutions
  • ou simplement tester le premier cas (redémarrage de l'application à chaque fois).
0

Vous pouvez utiliser la classe Timing de «Structures de données et algorithmes utilisant C#» de Michael McMillian.

En gros, il y aura comme suit:

TimeSpan startingTime, duration; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime; 
DoLengthyWork(); 
duration = Process.GetCurrentProcess.Threads(0).UserProcessorTime.Subtract(startingTime); 
1

Jon Skeet a écrit un très bon benchmarking « cadre » pour la mesure des opérations simples comme celui-ci que je pense serait assez bien adapté à la vérification de chacune de ces méthodes , que vous pouvez trouver ici: http://www.yoda.arachsys.com/csharp/benchmark.html (attention, il s'agit juste de chronométrer les opérations, pas de profilage de l'utilisation du tas ou quelque chose comme ça). Un point important à garder à l'esprit (Jon le remarque sur ce site ci-dessus, et Eric Lippert aime le mentionner à chaque fois que le sujet survient) est que lorsque vous exécutez du code plusieurs fois, il ne reçoit que le la première fois, donc si vous voulez mesurer les vraies différences pour chaque méthode, mesurez au moins deux fois et comparez les deuxièmes passages - j'imagine que c'est le résultat de vos ordres changeants.

Questions connexes