2010-02-08 4 views
7

C'è qualche punto in C# per eseguire operazioni di temporizzazione con precisione al millisecondo? Sto mettendo il codice di temporizzazione nel mio software e tutto viene restituito come 0ms. Mi piacerebbe sapere se c'è un modo per ottenere una granularità ancora più fine.C# sub millisecond timing

Addendum: è questo il codice corretto per ottenere tempi di intervallo inferiori al millisecondo?

timeSpan.TotalMilliseconds/10 

sto ancora ricevendo 0 come il tempo trascorso

+1

Stai sbagliando, ci saranno troppe cose che hanno un impatto così breve, come JIT, GC, cambio di contesto dei thread, altri thread occupati, ecc. Dovresti aumentare il tuo problema, eseguirne alcune o decine di migliaia di iterazioni sul tuo codice, ora in cui. –

+0

Si potrebbe prendere in considerazione l'utilizzo di un profiler. Ci sono diverse offerte commerciali e una gratuita su http://www.eqatec.com/tools/profiler – TrueWill

risposta

16

Si può sempre provare a utilizzare QueryPerformanceCounter o la classe StopWatch per un approccio gestito

+6

Non c'è motivo di utilizzare QueryPerformanceCounter come .NET 2.0. Il cronometro è incorporato e fa esattamente la stessa cosa. La frequenza di entrambi i timer è esattamente la stessa. –

+0

In effetti, ma non ha specificato specificamente che stava usando .NET 2.0 :) Anche se poi di nuovo non ho specificato che è stato 2.0+ per essere onesti. – tyranid

+0

@tyranid, Tecnicamente non ha specificato .NET, ha appena detto C#. Teoricamente potrebbe usare uno degli altri compilatori C# che compila per qualcos'altro (ne ho visti uno che compila su JavaScript e su un bytecode FVM). –

11

Usa System.Diagnostics.Stopwatch

3

solito misurare questo tipo di scenari ripetendo l'operazione più volte (quante ne sono necessarie per ottenere i millisecondi su alcune decine o centinaia.

Quindi è possibile regolare e misurare più facilmente.

1

Si potrebbe provare a misurare le prestazioni in questione di zecche invece di millisecondi. Sarà molto più accurato in termini di prestazioni.

ma sono d'accordo con Sam e Tyranid, utilizzare System.Diagnostics.StopWatch.

0

Ho imparato qualcosa di nuovo. Quelle zecche sono davvero utili. Esempio completo:

Stopwatch stopwatch = Stopwatch.StartNew(); 

// Run code to get duration of 

long durationInTicks = stopwatch.ElapsedTicks; 
Console.WriteLine($"Duration: {(decimal)durationInTicks/TimeSpan.TicksPerMillisecond:f3}ms"); 

È inoltre possibile utilizzare stopwatch.ElapsedTicks all'interno del Console.WriteLine, ma non so se questo abbia eventuali ritardi delle prestazioni, è per questo che prima recuperarlo e metterlo in una variabile.