Question

Je suis un novice total, mais j’écrivais un petit programme qui travaillait sur les chaînes en C # et j’ai remarqué que si je faisais certaines choses différemment, le code s’exécutait beaucoup plus rapidement.

Alors, je me demandais comment vous vous en teniez à la vitesse d'exécution de votre code? Existe-t-il des utilitaires (gratuits)? Est-ce que vous y allez à l’ancienne avec un System.Timer et faites-le vous-même?

Était-ce utile?

La solution

Ce que vous décrivez est appelé profilage de performance. Vous pouvez utiliser de nombreux programmes tels que profil Jetbrains ou Profil de fourmis , bien que la plupart ralentissent votre application tout en mesurant ses performances.

Pour lancer votre propre profilage des performances, vous pouvez utiliser System.Diagnostics.Stopwatch et un simple Console.WriteLine, comme vous l'avez décrit.

N'oubliez pas non plus que le compilateur C # JIT optimise le code en fonction du type et de la fréquence d'appel, aussi jouez avec des boucles de différentes tailles et méthodes, telles que les appels récursifs, pour avoir une idée de ce qui fonctionne le mieux.

Autres conseils

ANTS Profiler de RedGate est un très bon profileur de performances. Le dotTrace Profiler de JetBrains est également excellent. Ces outils vous permettront de voir les mesures de performances qui peuvent être explorées sur chaque ligne.

Scree shot de ANTS Profiler: ANTS http://www.red-gate.com/products/ ants_profiler / images / app / timeline_calltree3.gif

Si vous voulez vous assurer qu'une méthode spécifique reste dans les limites d'un seuil de performance spécifique lors des tests unitaires, utilisez Classe du chronomètre pour surveiller le temps d'exécution d'une méthode plusieurs fois dans une boucle et calculer la moyenne, puis Assert contre le résultat.

Juste un rappel - assurez-vous de compiler dans Release, pas de débogage! (J'ai vu cette erreur commise par des développeurs chevronnés - il est facile d'oublier).

Qu'est-ce que vous décrivez, c'est le "réglage des performances". Lorsque nous parlons de réglage de la performance, il y a deux angles. (a) Temps de réponse - temps nécessaire pour exécuter une demande / un programme particulier. (b) Débit - Nombre de requêtes qu'il peut exécuter en une seconde. Lorsque nous «optimisons» généralement, nous éliminons tout traitement inutile en améliorant le temps de réponse et le débit. Toutefois, si vous avez des événements d'attente dans votre code (tels que Thread.sleep (), I / O wait, etc.), votre temps de réponse est affecté, mais le débit n'est pas affecté. En adoptant un traitement parallèle (générant plusieurs threads), nous pouvons améliorer le temps de réponse, mais le débit ne sera pas amélioré. En général, pour les applications côté serveur, le temps de réponse et le débit sont importants. Pour les applications de bureau (comme IDE), le débit n’est pas important, seul le temps de réponse est important.

Vous pouvez mesurer le temps de réponse en effectuant un «test de performance» - il vous suffit de noter le temps de réponse pour toutes les transactions clés. Vous pouvez mesurer le débit à l'aide de 'Load Testing' - Vous devez pomper en permanence les demandes d'un nombre suffisamment grand de threads / clients, de sorte que l'utilisation du processeur de la machine serveur soit de 80 à 90%. Lorsque nous pompons une demande, nous devons maintenir le rapport entre les différentes transactions (appelé «combinaison de transactions») - par exemple: dans un système de réservation, il y aura 10 réservations pour 100 recherches. il y aura une annulation pour chaque 10 réservation, etc.

Une fois les transactions identifiées, vous devez effectuer un réglage du temps de réponse (test de performance). Vous pouvez identifier les points chauds à l'aide d'un profileur. Vous pouvez identifier les points chauds du débit en comparant le temps de réponse * fraction de cette transaction. Supposons que dans la recherche, la réservation, le scénario d’annulation, le rapport est de 89: 10: 1. Le temps de réponse est de 0.1 sec, 10 sec et 15 sec. charge pour la recherche - 0.1 * .89 = 0.089 charge pour la réservation - 10 * .1 = 1 charge pour cancell = 15 * .01 = 0.15 Ici, le réglage de la réservation aura un impact maximal sur le débit. Vous pouvez également identifier des points chauds pour le débit en effectuant plusieurs fois des vidages de threads (dans le cas d'applications basées sur Java).

Utilisez un profileur.

Si vous avez besoin de chronométrer une seule méthode spécifique, la classe Stopwatch peut être un bon choix.

Je fais les choses suivantes: 1) J'utilise des ticks (par exemple, dans VB.Net Now.ticks) pour mesurer l'heure actuelle. Je soustrais les ticks de départ de la valeur de ticks finis et divise par TimeSpan.TicksPerSecond pour obtenir combien de secondes il a fallu. 2) J'évite les opérations d'interface utilisateur (comme console.writeline). 3) J'exécute le code sur une boucle substantielle (environ 100 000 itérations) pour intégrer au mieux les variables d'utilisation / système d'exploitation.

Vous pouvez utiliser la classe StopWatch pour les méthodes de temps. Rappelez-vous que la première fois est souvent lente à cause du code qui doit être jeté.

Il existe une option .NET native (Team Edition pour les développeurs de logiciels) qui pourrait répondre à certains besoins d’analyse des performances. Dans le menu 2005 IDE .NET, sélectionnez Outils- > Outils de performance- > Assistant de performances ...

[GSS a probablement raison de dire que vous devez avoir Team Edition]

Ceci est un exemple simple pour tester la vitesse du code. J'espère que je vous ai aidé

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top