Domanda

Sono un principiante, ma stavo scrivendo un piccolo programma che funzionava con le stringhe in C # e ho notato che se avessi fatto alcune cose in modo diverso, il codice sarebbe stato eseguito molto più velocemente.

Quindi mi sono chiesto, come si fa a controllare la velocità di esecuzione del codice? Ci sono utilità (gratuite)? Ci provi alla vecchia maniera con un System.Timer e fai da te?

È stato utile?

Soluzione

Quello che stai descrivendo è noto come profiling delle prestazioni. Ci sono molti programmi che puoi ottenere per farlo come profiler Jetbrains o Ants profiler , sebbene la maggior parte rallenti la tua applicazione mentre sta misurando le sue prestazioni.

Per eseguire manualmente il roll-off della propria profilazione delle prestazioni, è possibile utilizzare System.Diagnostics.Stopwatch e una semplice Console.WriteLine, come hai descritto.

Tieni inoltre presente che il compilatore C # JIT ottimizza il codice in base al tipo e alla frequenza che viene chiamato, quindi gioca con loop di dimensioni e metodi diversi come le chiamate ricorsive per avere un'idea di ciò che funziona meglio.

Altri suggerimenti

Profiler ANTS di RedGate è un profiler di prestazioni davvero interessante. Anche dotTrace Profiler di JetBrains è eccezionale. Questi strumenti ti permetteranno di visualizzare le metriche delle prestazioni che possono essere analizzate su ogni singola riga.

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

Se si desidera garantire che un metodo specifico rimanga entro una soglia di prestazione specifica durante il test dell'unità, utilizzare Cronometro classe per monitorare il tempo di esecuzione di un metodo una o più volte in un ciclo e calcolare la media e quindi Assert contro il risultato.

Solo un promemoria: assicurati di compilare in Release, non Debug! (Ho visto questo errore fatto da sviluppatori esperti - è facile da dimenticare).

Quello che stai descrivendo è 'Performance Tuning'. Quando parliamo di performance tuning ci sono due angolazioni. (a) Tempo di risposta: il tempo necessario per eseguire una particolare richiesta / programma. (b) Throughput: quante richieste può eseguire in un secondo. Quando in genere "ottimizziamo", quando eliminiamo l'elaborazione non necessaria, migliorano sia il tempo di risposta che la velocità di trasmissione. Tuttavia, se nel tuo codice sono presenti eventi di attesa (come Thread.sleep (), I / O wait ecc.), Il tempo di risposta è influenzato, tuttavia la velocità effettiva non è influenzata. Adottando l'elaborazione parallela (che genera più thread) possiamo migliorare i tempi di risposta, ma il throughput non sarà migliorato. In genere per l'applicazione lato server sono importanti sia il tempo di risposta che la velocità effettiva. Per le applicazioni desktop (come IDE) la velocità effettiva non è importante, solo i tempi di risposta sono importanti.

È possibile misurare i tempi di risposta mediante "Test delle prestazioni": basta annotare i tempi di risposta per tutte le transazioni chiave. È possibile misurare il throughput mediante "Test del carico": è necessario inoltrare continuamente le richieste da un numero sufficientemente elevato di thread / client in modo tale che l'utilizzo della CPU della macchina server sia dell'80-90%. Quando eseguiamo la richiesta, dobbiamo mantenere il rapporto tra diverse transazioni (chiamato mix di transazioni) - ad esempio: in un sistema di prenotazione ci saranno 10 prenotazioni per ogni 100 ricerche. ci sarà una cancellazione per ogni 10 prenotazioni ecc.

Dopo aver identificato le transazioni richiedono l'ottimizzazione per i tempi di risposta (test delle prestazioni) è possibile identificare i punti critici utilizzando un profiler. È possibile identificare gli hot spot per il throughput confrontando il tempo di risposta * frazione di quella transazione. Supponiamo che la ricerca, la prenotazione, lo scenario di annullamento, il rapporto sia 89: 10: 1. I tempi di risposta sono 0,1 sec, 10 sec e 15 sec. carica per ricerca - 0.1 * .89 = 0.089 carico per prenotazione- 10 * .1 = 1 carico per annullamento = 15 * .01 = 0.15 Qui l'ottimizzazione della prenotazione produrrà il massimo impatto sulla velocità effettiva. Puoi anche identificare gli hot spot per il throughput prendendo ripetutamente thread dump (nel caso di applicazioni basate su Java).

Usa un profiler.

Se devi cronometrare solo un metodo specifico, la classe Cronometro potrebbe essere una buona scelta.

Faccio le seguenti cose: 1) Uso i tick (ad es. In VB.Net Now.ticks) per misurare l'ora corrente. Sottraggo i tick iniziali dal valore tick completato e li divido per TimeSpan.TicksPerSecond per ottenere quanti secondi ci sono voluti. 2) Evito le operazioni dell'interfaccia utente (come console.writeline). 3) Eseguo il codice su un ciclo sostanziale (come 100.000 iterazioni) per tenere conto delle variabili di utilizzo / SO nel modo migliore possibile.

È possibile utilizzare la classe StopWatch per cronometrare i metodi. Ricorda che la prima volta è spesso lenta a causa del jitter del codice.

Esiste un'opzione .NET nativa (Team Edition for Software Developers) che potrebbe soddisfare alcune esigenze di analisi delle prestazioni. Dal menu IDE .NET del 2005, seleziona Strumenti- > Performance Tools- > Performance Wizard ...

[GSS è probabilmente corretto che devi avere Team Edition]

Questo è un semplice esempio per testare la velocità del codice. Spero di averti aiutato

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top