2010-02-08 9 views
7

¿Hay algún lugar en C# que permita realizar operaciones de temporización con una precisión inferior a milisegundos? Estoy poniendo código de tiempo en mi software y todo se devuelve como 0 ms. Me gustaría saber si hay una manera de obtener una granularidad aún más fina.C# temporización de milisegundos

Addendum: ¿es este el código correcto para obtener un tiempo de milisegundos sub?

timeSpan.TotalMilliseconds/10 

Todavía estoy 0 como el tiempo transcurrido

+1

Lo estás haciendo mal, habrá demasiadas cosas que impacten en un intervalo de tiempo tan corto, como JIT, GC, cambio de contexto de hilo, otros subprocesos que estén ocupados, etc. Deberías escalar tu problema, ejecutar algunos miles o decenas de miles de iteraciones en tu código, tiempo que. –

+0

En su lugar, podría considerar el uso de un generador de perfiles. Hay varias ofertas comerciales, y una gratuita en http://www.eqatec.com/tools/profiler – TrueWill

Respuesta

16

Siempre se podría tratar de usar QueryPerformanceCounter o la clase StopWatch para un enfoque de gestión

+6

No hay ninguna razón para usar QueryPerformanceCounter a partir de .NET 2.0. Cronómetro está incorporado y hace exactamente lo mismo. La frecuencia de ambos temporizadores es exactamente la misma. –

+0

De hecho, pero él no dijo específicamente que estaba usando .NET 2.0 :) Aunque, de nuevo, no especifiqué que era 2.0+ para ser justo. – tyranid

+0

@tyranid, Técnicamente él tampoco especificó .NET, solo dijo C#. Teóricamente podría estar usando uno de los otros compiladores de C# que se compila en otra cosa (he visto algunos que se compilan en JavaScript y en código de byte FVM). –

11

Uso System.Diagnostics.Stopwatch

3

Por lo general, este tipo mido de escenarios repitiendo la operación varias veces (tantas como sea necesario para obtener los milisegundos en unas pocas docenas o cientos.

Luego puede ajustar y medir más fácilmente.

1

Puede intentar medir su rendimiento en cuestión de Ticks en lugar de milisegundos. Será mucho más preciso en términos de rendimiento.

pero estoy de acuerdo con Sam y Tyranid, use System.Diagnostics.StopWatch.

0

Aprendí algo nuevo. Esas garrapatas son realmente útiles. Ejemplo completo:

Stopwatch stopwatch = Stopwatch.StartNew(); 

// Run code to get duration of 

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

También puede utilizar stopwatch.ElapsedTicks dentro del Console.WriteLine, pero no sé si eso tiene retrasos de rendimiento, es por eso que primero recuperarlo y ponerlo en una variable.

Cuestiones relacionadas