En primer lugar, debe tener en cuenta que es extremadamente difícil, si no imposible, hacer el tiempo exacto en una computadora debido a las limitaciones expuestas tanto por el hardware como por el software. La buena noticia es que este tipo de precisión rara vez es necesario. Diez tics es un increíblemente pequeño cantidad de tiempo. Se está haciendo muy poco trabajo por parte de la CPU en este intervalo, y nunca va a ser estadísticamente significativo.
Como referencia, el reloj de Windows tiene una precisión de alrededor de 10 milisegundos (menos en versiones anteriores). Envolver su código con llamadas al DateTime.UtcNow
no va a hacer nada mejor que eso.
En su pregunta, usted habla de querer "plantear un evento". El problema es que el único tipo de objeto de mantenimiento del tiempo que genera un evento en intervalos específicos es el objeto Timer
. Está disponible en 3 encarnaciones diferentes en .NET Framework (System.Timers.Timer
, System.Threading.Timer
y System.Windows.Forms.Timer
), todos los cuales tienen sus propios escenarios de uso únicos y peculiaridades relativas, pero ninguno de ellos garantiza precisión en cualquier lugar cerca de lo que está pidiendo . Ni siquiera están diseñados para hacerlo, y tampoco hay funciones equivalentes expuestas por la API de Windows que proporcionen este tipo de precisión.
La razón por la que pregunté por qué querías hacer esto y si estás tratando de establecer un punto de referencia es porque eso cambia todo el juego. .NET Framework (a partir de la versión 2.0) proporciona un Stopwatch
object que está expresamente diseñado para medir con precisión el tiempo transcurrido para una situación como la evaluación comparativa o el perfil de rendimiento. El Stopwatch
simplemente ajusta las funciones de la API de Windows QueryPerformanceFrequency
y QueryPerformanceCounter
(que debe confirmar mi sugerencia en cuanto a su uso previsto). Solíamos tener P/Invocar estas funciones para acceder a este tipo de funcionalidad en versiones anteriores del Framework, pero ahora está cómodamente integrado. Si necesita un temporizador con una resolución relativamente alta para el benchmarking, el Stopwatch
es su mejor opción . En teoría, puede proporcionarle un tiempo de sub-microsegundo.
Pero no está exento de problemas. No genera ningún evento, por lo que si su diseño actual depende del manejo de eventos, tendrá que volver a pensarlo. Y, , tampoco está garantizado que sea perfectamente exacto. Claro, puede tener la mayor resolución posible teniendo en cuenta las limitaciones de hardware, pero eso no significa que necesariamente cumplirá con los requisitos establecidos. Por ejemplo, puede no ser confiable en un sistema de procesador múltiple donde Start
y Stop
tienen que ejecutarse en el mismo procesador. No debería importar, pero it does. También es subject to being unreliable en procesadores que pueden acelerar su velocidad de reloj hacia arriba y hacia abajo. Y me atrevería a mencionar que la llamada al QueryPerformanceCounter
va a llevar algo de tiempo, unos 5 microsegundos incluso en un moderno procesador de 2+ GHz, lo que evita que realmente pueda alcanzar esa temporización de sub microsegundos que sonaba bien en teoría. Por otra parte, cualquier generador de perfiles de código razonable consideraría que esa cantidad de tiempo es insignificante porque, bueno, es.
(Ver también: http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)
¿Por qué en el mundo le gustaría plantear un evento cada 11 tics? ¿Estás usando esto para crear perfiles de código? –
Usted no está respondiendo preguntas. 11 tic es solo un ejemplo. todo lo que quiero es un temporizador de alta resolución. si es posible, hasta 1 tick. y sí, estoy desarrollando una aplicación para hacer algún punto de referencia. –
Es por eso que apoyo los comentarios de downvoting –