Estoy escribiendo un código como este, haciendo un poco de tiempo rápido y sucio:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Seguramente hay una manera de llamar a este fragmento de código de tiempo como una lambda .NET 3.0 elegante en lugar de (Dios no lo quiera) cortarlo y pegarlo varias veces y reemplazarlo DoStuff(s)
con DoSomethingElse(s)
?
Sé que se puede hacer como un Delegate
método, pero me pregunto sobre el método lambda.
Time
se comporta como un método estático, descartando todo el estado existente ensw
, por lo que introducirlo como un método de instancia parece ingenioso.Stopwatch.StartNew
, que es estático por una razón. C # carece de la capacidad de agregar métodos estáticos a las clases existentes (a diferencia de F #), así que entiendo el impulso de hacer esto, pero todavía me deja mal sabor de boca.Esto es lo que he estado usando:
Uso:
fuente
Console.WriteLine("")
para probar// do stuff that I want to measure
, el compilador no está contento en absoluto. ¿Se supone que debe hacer expresiones y declaraciones normales allí?Puede intentar escribir un método de extensión para cualquier clase que esté usando (o cualquier clase base).
Me gustaría que la llamada se viera así:
Entonces el método de extensión:
Cualquier objeto derivado de DependencyObject ahora puede llamar a TimedFor (..). La función se puede ajustar fácilmente para proporcionar valores de retorno a través de parámetros de referencia.
-
Si no desea que la funcionalidad esté vinculada a ninguna clase / objeto, puede hacer algo como:
Entonces podrías usarlo como:
De lo contrario, esta respuesta parece que tiene una habilidad "genérica" decente:
¿Envolviendo el cronometraje StopWatch con un delegado o lambda?
fuente
La
StopWatch
clase no tiene por qué serDisposed
oStopped
por error. Entonces, el código más simple para cronometrar alguna acción esCódigo de llamada de muestra
No me gusta la idea de incluir las iteraciones en el
StopWatch
código. Siempre puede crear otro método o extensión que maneje la ejecución deN
iteraciones.Código de llamada de muestra
Aquí están las versiones del método de extensión
Y código de llamada de muestra
Probé los métodos estáticos y los métodos de extensión (combinando iteraciones y puntos de referencia) y el delta del tiempo de ejecución esperado y el tiempo de ejecución real es <= 1 ms.
fuente
Escribí una clase simple de CodeProfiler hace algún tiempo que envolvió Stopwatch para perfilar fácilmente un método usando una Acción: http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
También le permitirá perfilar fácilmente el código multiproceso. El siguiente ejemplo perfilará la acción lambda con 1-16 subprocesos:
fuente
Suponiendo que solo necesita una sincronización rápida de una cosa, esto es fácil de usar.
fuente
Puede sobrecargar una serie de métodos para cubrir varios casos de parámetros que tal vez desee pasar a la lambda:
Alternativamente, puede usar el delegado Func si debe devolver un valor. También puede pasar una matriz (o más) de parámetros si cada iteración debe usar un valor único.
fuente
Para mí, la extensión se siente un poco más intuitiva en int, ya no es necesario crear una instancia de un cronómetro ni preocuparse por restablecerlo.
Así que tienes:
Con el uso de muestra de:
Salida de muestra:
fuente
Me gusta usar las clases CodeTimer de Vance Morrison (uno de los tipos de rendimiento de .NET).
Hizo una publicación en su blog titulada " Medir el código administrado de forma rápida y sencilla: CodeTimers ".
Incluye cosas interesantes como MultiSampleCodeTimer. Hace un cálculo automático de la desviación estándar y media y también es muy fácil imprimir sus resultados.
fuente
fuente