2012-02-14 25 views
13

Como todos sabemos, el cronómetro puede tener problemas en una aplicación asíncrona de subprocesos múltiples que se ejecutará en todos los núcleos.¿Cronómetro cronómetro .Net y multinúcleo?

En una computadora multiprocesador, no importa en qué procesador se ejecuta la secuencia. Sin embargo, debido a errores en el BIOS o la capa de abstracción de hardware (HAL), puede obtener diferentes resultados de tiempo en diferentes procesadores. Para especificar la afinidad del procesador para un hilo, use el método ProcessThread.ProcessorAffinity.

¿Hay alguna forma de obtener una marca de tiempo/marca de tiempo confiable como valores que tengan alta resolución/precisión y que sea consistente en todos los núcleos de la CPU?

Si no es posible hacer que el cronómetro (QueryPerformanceCounter) multi-core sea seguro, ¿cuál es la siguiente mejor forma de obtener una buena marca de tiempo en los núcleos? DateTime.UtcNow.Ticks o Environment.TickCount? Cualquier otro contador?

Necesito una mejor resolución que la que DateTime.UtcNow.Ticks puede proporcionar. (10-15ms)

Respuesta

7

He buscado una respuesta a este problema específico y lo mejor que he visto es DateTime.UtcNow. Parece que no hay una alta resolución expuesta a Windows y contador confiable (he buscado en Google por años y todavía no he encontrado ninguno).

+0

código de ejemplo de uso? –

5

En realidad, según el official documentation, posterior a Windows XP, debería estar bien usar StopWatch/QueryPerformanceCounter en sistemas multiprocesador. Si el sistema no admite TSC invariables, QPC utilizará automáticamente una estrategia de temporizador diferente.

Observe la sección de comentarios, sin embargo, para sistemas virtualizados. Parece que debes tener cuidado en ese caso específico.