2010-02-08 12 views
7

Gibt es irgendwo in C# Timing-Operationen mit einer Genauigkeit von unter einer Millisekunde? Ich setze Timing-Code in meine Software und alles wird als 0ms zurückgegeben. Ich würde gerne wissen, ob es eine Möglichkeit gibt, noch feiner zu werden.C# unter Millisekunden Timing

Nachtrag: ist dies der richtige Code Sub-Millisekunden-Zeit zu bekommen?

timeSpan.TotalMilliseconds/10 

Ich bin noch immer 0 als die verstrichene Zeit

+1

Sie tun es falsch, gibt viel zu viele Dinge sein wird so kurze Zeitspanne zu beeinflussen, wie JIT, GC, Schaltthreadkontext, andere Threads beschäftigt zu sein, etc. Sie Ihr Problem vergrößern sollte, führen einige tausend oder Zehntausende von Iterationen auf Ihrem Code, Zeit dafür. –

+0

Sie könnten stattdessen einen Profiler verwenden. Es gibt mehrere kommerzielle Angebote und ein kostenloses unter http://www.eqatec.com/tools/profiler – TrueWill

Antwort

16

Sie immer versuchen könnte QueryPerformanceCounter oder die StopWatch Klasse für einen verwalteten Ansatz

+6

Es gibt keinen Grund, QueryPerformanceCounter ab .NET 2.0 zu verwenden. Stoppuhr ist eingebaut und macht genau das gleiche. Die Frequenz beider Timer ist genau gleich. –

+0

In der Tat, aber er gab nicht ausdrücklich an, dass er .NET 2.0 verwendet :) Obwohl ich dann nicht wieder gesagt habe, dass es 2.0+ war, um fair zu sein. – tyranid

+0

@tyranid, Technisch hat er auch .NET nicht angegeben, er hat nur C# gesagt. Theoretisch könnte er einen der anderen C# -Compiler verwenden, die sich zu etwas anderem kompilieren (ich habe solche gesehen, die nach JavaScript und FVM-Bytecode kompilieren). –

11

Verwenden System.Diagnostics.Stopwatch

3

Normalerweise messe ich diese Art von Szenarien, indem die Operation mehrmals wiederholt wird (so viele, wie benötigt werden, um die Millisekunden über ein paar Dutzend oder hundert zu erhalten.

Dann können Sie einfacher einstellen und messen.

1

Sie könnten versuchen, Ihre Leistung in der Angelegenheit von Ticks statt Millisekunden gemessen wird. Es wird viel genauer in Bezug auf die Leistung sein.

aber ich stimme mit Sam und Tyraniden, Verwendung System.Diagnostics.Stopwatch.

0

Ich habe etwas Neues gelernt. Diese Ticks sind in der Tat praktisch. Komplettes Beispiel:

Stopwatch stopwatch = Stopwatch.StartNew(); 

// Run code to get duration of 

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

können Sie auch stopwatch.ElapsedTicks innerhalb des Console.WriteLine verwenden, aber ich weiß nicht, ob das irgendwelche Leistungsverzögerungen hat, deshalb habe ich es zuerst abrufen und in einer Variablen setzen.