2013-05-04 14 views
69

Desidero sapere per quanto tempo una procedura/funzione/ordine impiega a fini di test.Tempo di esecuzione codice di misurazione

Questo è quello che ho fatto, ma il mio metodo è sbagliato perche' se la differenza di secondi è 0 non può restituire i millisecondi trascorsi:

Avviso il valore del sonno è di 500 ms secondi in modo trascorso è 0 allora può 'restituire millisecondi.

Dim Execution_Start As System.DateTime = System.DateTime.Now 
    Threading.Thread.Sleep(500) 

    Dim Execution_End As System.DateTime = System.DateTime.Now 
    MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _ 
    DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _ 
    DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _ 
    DateDiff(DateInterval.Second, Execution_Start, Execution_End), _ 
    DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60)) 

Qualcuno può mostrarmi un modo migliore per farlo? Forse con un TimeSpan?

La soluzione:

Dim Execution_Start As New Stopwatch 
Execution_Start.Start() 

Threading.Thread.Sleep(500) 

MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _ 
     "M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _ 
     "S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _ 
     "MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _ 
     "Code execution time", MessageBoxButtons.OK, MessageBoxIcon.Information) 
+0

@Soner Se l'ho taggato con C# è perché il codice C# è il benvenuto per me. – ElektroStudios

+0

Puoi vedere la mia risposta a questa domanda:> http://stackoverflow.com/a/16130243/1507182 Buona fortuna – Obama

+1

possibile duplicato di [Trova tempo di esecuzione di un metodo] (http://stackoverflow.com/questions/16130232/find-execution-time-of-a-method) – Jesse

risposta

152

Un modo migliore sarebbe usare Stopwatch, invece di DateTime differenze.

Stopwatch Class - MSDN

fornisce un insieme di metodi e proprietà che è possibile utilizzare per misurare con precisione il tempo trascorso. tempo

Stopwatch stopwatch = Stopwatch.StartNew(); //creates and start the instance of Stopwatch 
//your sample code 
System.Threading.Thread.Sleep(500); 
stopwatch.Stop(); 
Console.WriteLine(stopwatch.ElapsedMilliseconds); 
+0

@ElektroHacker, sei il benvenuto, è più facile da usare, in più è più preciso di DateTime :) – Habib

+0

Si prega di fare riferimento https://github.com/chai-deshpande/LogExec (un pacchetto NUGET è anche disponibile https://www.nuget.org/packages/LogExec/). Questo fa esattamente le stesse cose che @ soner-gonul ha menzionato, ma l'uso è privo di ingombri e nasconde tutto il codice boilerplate. Molto utile quando si desidera utilizzarlo molto frequentemente. Utilizza anche Common.Logging per poterlo integrare con il tuo provider di registrazione preferito. – Chai

+0

@Habib, per favore, aiutami a capire perché Thread.sleep (500) è necessario? Non posso farlo saltando il sonno, lo renderebbe meno efficiente? –

45

Stopwatch misure trascorso.

// Create new stopwatch 
Stopwatch stopwatch = new Stopwatch(); 

// Begin timing 
stopwatch.Start(); 

Threading.Thread.Sleep(500) 

// Stop timing 
stopwatch.Stop(); 

Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed); 

Questo è un DEMO.

+0

può essere utilizzato per il tempo di esecuzione di ogni riga di codice? ad esempio: bindingSource.datasource = db.table; // quanto ci vuole lungo? – vaheeds

+2

@vaheeds Certo. Basta avviare questo 'Cronometro 'sopra ogni linea e fermarlo dopo ogni linea. Ricordare, è necessario utilizzare anche ['Stopwatch.Reset'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.reset.aspx) dopo ogni singola riga da calcolare. In base alla tua linea; dai un'occhiata a http://ideone.com/DjR6ba –

+0

ho fatto un piccolo trucco per far uscire i milisecondi dalla foto. in questo modo watch.Elapsed.ToString(). Split ('.') [0] – Doruk

8

Se si utilizza la classe cronometro, è possibile utilizzare il .StartNew() metodo per ripristinare l'orologio a 0. Quindi non c'è bisogno di chiamare .Reset() seguito da .Start() . Potrebbe tornare utile.

21

È possibile utilizzare questo wrapper Cronometro:

public class Benchmark : IDisposable 
{ 
    private readonly Stopwatch timer = new Stopwatch(); 
    private readonly string benchmarkName; 

    public Benchmark(string benchmarkName) 
    { 
     this.benchmarkName = benchmarkName; 
     timer.Start(); 
    } 

    public void Dispose() 
    { 
     timer.Stop(); 
     Console.WriteLine($"{benchmarkName} {timer.Elapsed}"); 
    } 
} 

Usage:

using (var bench = new Benchmark($"Insert {n} records:")) 
{ 
    ... your code here 
} 

uscita:

Insert 10 records: 00:00:00.0617594 

Per gli scenari avanzati, è possibile utilizzare Benchmark.It o NBench

+2

Grazie, la migliore risposta finora – pixel

+1

Grazie, cercavo in modo centralizzato. Ho fatto questa strategia anche con ActionFilter. –

1

Il cronometro è progettato per questo scopo ed è uno dei modi migliori per misurare l'esecuzione del tempo in .NET.

var watch = System.Diagnostics.Stopwatch.StartNew(); 
/* the code that you want to measure comes here */ 
watch.Stop(); 
var elapsedMs = watch.ElapsedMilliseconds; 

Non utilizzare DateTimes per misurare l'esecuzione del tempo in .NET.

Problemi correlati