2009-07-19 22 views
8

me pareció una buena question para medir el rendimiento de la función, y las respuestas recomiendan usar cronómetro de la siguiente manera¿Mejores prácticas para el cronómetro en la máquina de múltiples procesadores?

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//DoWork 
sw.Stop(); 
//take sw.Elapsed 

¿Pero esto es válido si está ejecutando debajo de la máquina procesadores multi? el hilo se puede cambiar a otro procesador, ¿o sí? También lo mismo debería ser en Enviroment.TickCount. Si la respuesta es sí debería envolver mi código dentro BeginThreadAffinity de la siguiente manera

Thread.BeginThreadAffinity(); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//DoWork 
sw.Stop(); 
//take sw.Elapsed 
Thread.EndThreadAffinity(); 

PS

La conmutación puede ocurrir sobre el nivel del hilo no sólo el nivel de procesador, por ejemplo, si la función se está ejecutando en otro hilo para que el sistema pueda cambiarlo a otro procesador, si eso sucede, ¿el cronómetro será válido después de este cambio?

No uso del cronómetro para medir perfromance solamente, sino también para simular la función de temporizador utilizando Thread.Sleep (para evitar la superposición de llamada)

Respuesta

5

Si la función en sí misma no es multiproceso (por ejemplo, que no desova otros hilos/procesos y espere a que se completen), entonces el único problema es su máquina.

Si su máquina está ocupada haciendo otras cosas que podría invalidar la prueba (por ejemplo, que codifica un vídeo H.264 mientras se hace una prueba vinculado a la CPU). Del mismo modo, si utiliza toda la memoria física al probar algo que está limitado a la memoria, podría invalidar sus resultados.

lo tanto, el principio general es que la máquina debe estar bajo una carga-minimal-a la normalidad cuando la realización de dichos ensayos. Aparte de eso, no hay un problema de multiprocesamiento. Sí, el programa podría intercambiar núcleos durante la ejecución, pero la sobrecarga de hacerlo es o bien un pequeño porcentaje de su tiempo medido o el tiempo medido es tan pequeña que la granularidad de la medición del tiempo del sistema es un problema.

+0

si la función se ejecuta en un hilo de fondo, esto significa que el hilo de función puede cambiar a otro procesador que produce error en las medidas –

+0

Según MSDN: "Los hilos de fondo son idénticos a los de primer plano, excepto que los hilos de fondo no evitar que un proceso termine ". Ref: http: // msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx –

+0

@Tormod Fjeldskår, hilos frontales/de fondo se puede cambiar a otros procesadores de tal modo que no se preocupan por su tipo, pero lo mencioné en mi comentario para ejemplo no más –

2

creo que estás preguntando acerca de la implementación de bajo nivel de Cronómetro y si el cambio procesadores en el medio de la ejecución podría invalidar el comportamiento. La aplicación hace uso de QueryPerformanceCounter internamente (véase el BCL Fuentes de referencia de MS; He confirmado que en .NET 4.0 como mínimo.)

la MS documentation para esta API estados:

En un equipo con varios procesadores, se no debería importar qué procesador está llamado . Sin embargo, se puede obtener diferentes resultados en diferentes procesadores debido a los errores en el sistema básico de entrada/salida (BIOS) o la capa de abstracción de hardware (HAL).

Por lo tanto, estás en lo correcto; en principio, no debería importar, pero este comentario sugiere que se han observado casos en los que la implementación no concuerda con la interfaz prevista. Si desea garantizar la exactitud de la medición, puede usar la afinidad de subprocesos, como indicó. Dicho esto, supongo que cualquier error observado es bastante pequeño, ya que una gran diferencia sería un error BIOS o HAL bastante serio.

Cuestiones relacionadas