Por preciso no me refiero a números altos, si no a muy bajos, a décimas de milisegundo.
Pues eso me parece incluso mucho, pero mucho peor.
¿Porque necesitas tanta precisión?, exigir reiteradamente operaciones en un tiempo menor que 10-100 ms no es nada sano para tu aplicación, cuanto más pequeño y más continuo sea el lapso más acabaría mermando el rendimiento en general tanto de la aplicación como del equipo.
De todas formas, te informo:
Según un articulo de MSDN del que ahora mismo no dispongo la url (fue movido o eliminado), tanto el 'System.Windows.Forms.Timer' como el 'System.Timers.Timer' tienen una precisión media de 10 a 55 ms según la versión de Windows en ejecución (y otros factores a tener en cuenta como el consumo de las otras aplicaciones que estén en segundo plano), y estos no están diseñados para cronometrar de forma precisa, sino para desencadenar eventos en un intervalo específico.
Por lo contrario, un StopWatch es todo lo contrario a un Timer, es como un cronómetro y su función si es la de (intentar) medir el tiempo de forma precisa.
Pero la precisión de un StopWatch depende de varios factores en los que tú no puedes influir, como por ejemplo el hardware instalado (los contadores de rendimiento) y el sistema operativo en ejecución:
·
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.ishighresolution%28v=vs.110%29.aspxAsí como también depende de la frecuencia de los ticks:
·
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.frequency%28v=vs.110%29.aspxFor example, a timer frequency of 2 million ticks per second equals a timer resolution of 500 nanoseconds
En mi caso la propiedad "
Stopwatch.Frequency" me devuelve un valor estático de "3.919.409", pero escribí un código para testearlo y me suma alrededor de "3.923.329" de ticks por segundo, puedes comprobar cuantos ticks haces tú:
Dim sw As New Stopwatch
With sw
.Start()
While .ElapsedMilliseconds <= 1000
Debug.
WriteLine(.
ElapsedTicks) End While
.Stop()
End With
Además debes asegurarte de utilizar la propiedad
Stopwatch.ElapsedTicks para medir microsegundos/nanosegundos, no la propiedad
Elapsed.Ticks ya que este devuelve un TimeSpan, y aquí tienes una explicación más detallada de ello:
·
http://stackoverflow.com/questions/1562850/precise-time-in-net¿Lo más apropiado para eso es stopWath?
Sí, es a lo que más puedes aspirar.
También podrías utilizar la API
QueryPerformanceCounter y
QueryPerformanceFrequency pero aparte de que esto nunca lo he probado (no me surge la necesidad ni tampoco me interesa) se supone que el Stopwatch es un wrapper de esas funciones, así que básicamente debe ser lo mismo, pero aquí tienes un ejemplo:
·
http://msdn.microsoft.com/en-us/library/aa964692%28v=vs.85%29.aspxSaludos.