2008-10-28 19 views
55

¿Alguna vez se puede utilizar Environment.TickCount para calcular el lapso de tiempo?Environment.TickCount vs DateTime.Now

int start = Environment.TickCount; 
// Do stuff 
int duration = Environment.TickCount - start; 
Console.WriteLine("That took " + duration " ms"); 

Debido TickCount se firma y se vuelco del vehículo después de 25 días (se tarda 50 días para golpear los 32 bits, pero hay que descartar el bit firmado si desea hacer cualquier sentido de la matemáticas), parece como si fuera demasiado arriesgado para ser útil.

Estoy usando DateTime.Now en su lugar. ¿Es ésta la mejor manera de hacer ésto?

DateTime start = DateTime.Now; 
// Do stuff 
TimeSpan duration = DateTime.Now - start; 
Console.WriteLine("That took " + duration.TotalMilliseconds + " ms"); 
+11

Como no relacionada a un lado, si usted hace uso de DateTime para los cálculos matemáticos relacionados con la fecha, utilice siempre DateTime. UtcNow como DateTime.Now es susceptible al horario de verano ... tus cálculos podrían estar fuera por una hora, o peor, números negativos. –

+5

@Scott: Pensé que vale la pena mencionar: incluso con 'UtcNow', está el problema de las sincronizaciones programadas de NTP: no es raro que el tiempo del sistema cambie en un orden de 10 segundos después de estas actualizaciones (en mi PC). – Groo

+0

La matemática en realidad no es tan complicada ... 'int duration = unchecked ((int) ((uint) Environment.TickCount - (uint) start));' ... le dará la respuesta correcta independientemente de los refinanciamientos. (Lo ideal es saltear el elenco para regresar a 'int' a menos que lo necesite). – AnorZaken

Respuesta

64

Usar la clase Cronómetro. Hay un ejemplo decente en MSDN: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Stopwatch stopWatch = Stopwatch.StartNew(); 
    Thread.Sleep(10000); 
    stopWatch.Stop(); 
    // Get the elapsed time as a TimeSpan value. 
    TimeSpan ts = stopWatch.Elapsed; 
+1

La clase de cronómetro solo está disponible en .NET Framework 2.0 y versiones posteriores. En las versiones anteriores, utilizaría TickCount, posiblemente combinado con un TimeSpan para comprobar si había cruzado el límite de 25 días. –

+8

Simplemente curioso, ¿cuánta gente todavía usa el 1.1 BCL? Incluso Mono admite 3.5. – Dykam

+0

En versiones anteriores, utilizaría p/invoke-calls como safe y http://msdn.microsoft.com/en-us/library/ms901807.aspx, no TickCount. – Henrik

8

Uso

System.Diagnostics.Stopwatch 

Tiene una propiedad llamada

EllapsedMilliseconds 
0

utilizo Environment.TickCount porque:

  1. clase el cronómetro no está en el Compact Framework.
  2. Cronómetro utiliza el mismo mecanismo de tiempo subyacente como TickCount, por lo que los resultados no serán más o menos precisos.
  3. El problema de envoltura con TickCount es cósmicamente improbable que sea golpeado (tendrías que dejar tu computadora encendida durante 27 días y luego intentar medir un tiempo que simplemente abarca el momento de envoltura), e incluso si lo lograste, el resultado sería un período de tiempo muy negativo (por lo que se destacaría).

Dicho esto, también recomendaría usar Stopwatch, si está disponible para usted. O puede tomar aproximadamente 1 minuto y escribir una clase parecida a un cronómetro que envuelva Environment.TickCount.

Por cierto, no veo nada en la documentación de Cronómetro que menciona el problema de envolver con el mecanismo de temporizador subyacente, por lo que no me sorprendería en absoluto para encontrar que Cronómetro sufre del mismo problema. Pero, de nuevo, no me preocuparía por eso.

+1

Bueno, al menos los números 1 y 3 son correctos. – MusiGenesis

+2

# 3 realmente no está bien, la respuesta de Matthews tiene una mejor explicación. No se trata de tiempos relativos cerca del envolvente, el envolvente es solo un problema si _medidas_ veces más que los veinte días. – SoftMemes

+1

# 3 está mal, incluso, esto es un gran problema si ejecuta algo que podría utilizarse como un servicio en un servidor, o incluso aplicaciones en un servidor de terminal. Incluso la computadora de mi casa a veces continúa durante dos o más meses sin reiniciar (no estoy seguro de cómo actúan el modo de espera y la hibernación en los tics, pero sospecho que no los reinician). – Lucero

0

Iba a decir envolverlo en una clase de cronómetro, pero Grzenio ya dijo lo correcto, así que le daré un impulso. Tal encapsulamiento factoriza la decisión en cuanto a qué camino es mejor, y esto puede cambiar con el tiempo. Recuerdo que me sorprendió lo caro que puede ser obtener tiempo en algunos sistemas, por lo que tener un lugar que pueda implementar la mejor técnica puede ser muy importante.

0

Para la sincronización de una sola vez, es aún más fácil de escribir

Stopwatch stopWatch = Stopwatch.StartNew(); 
...dostuff... 
Debug.WriteLine(String.Format("It took {0} milliseconds", 
           stopWatch.EllapsedMilliseconds))); 

supongo que la envolvente cósmicamente improbable en TickCount es aún una preocupación menor para el cronómetro, dado que el campo ElapsedTicks es mucho. En mi máquina, StopWatch es de alta resolución, con 2.4e9 tics por segundo.Incluso a ese ritmo, tomaría más de 121 años desbordar el campo de las garrapatas. Por supuesto, no sé lo que está pasando bajo las sábanas, así que tómalo con un grano de sal. Sin embargo, noto que la documentación para StopWatch ni siquiera menciona el problema envolvente, mientras que el documento para TickCount sí lo hace.

21

¿Por qué le preocupa el vuelco? Siempre que la duración que está midiendo sea inferior a 24.9 días y calcule la duración relativa de , estará bien. No importa cuánto tiempo haya estado funcionando el sistema, siempre y cuando solo se preocupe por la parte de ese tiempo de ejecución (en lugar de realizar directamente comparaciones menores o mayores que en los puntos de inicio y final). Es decir. esto:

int before_rollover = Int32.MaxValue - 5; 
int after_rollover = Int32.MinValue + 7; 
int duration = after_rollover - before_rollover; 
Console.WriteLine("before_rollover: " + before_rollover.ToString()); 
Console.WriteLine("after_rollover: " + after_rollover.ToString()); 
Console.WriteLine("duration: " + duration.ToString()); 

imprime correctamente:

before_rollover: 2147483642 
after_rollover: -2147483641 
duration: 13 

Usted no tiene que preocuparse por el bit de signo. C#, como C, deja que la CPU maneje esto.

Esta es una situación común con la que me he encontrado antes con el recuento de tiempo en sistemas integrados. Nunca compararía beforerollover < afterrollover directamente, por ejemplo. Siempre realizaría la resta para encontrar la duración que tiene en cuenta la transferencia, y luego basaría cualquier otro cálculo en la duración.

+3

Todavía explotará después de 50 días. No es bueno en un servidor. – usr

+3

La mejor respuesta IMO. Esto no "explotará después de 50 días" tampoco, a menos que intente usarlo para rastrear un período de tiempo que sea mayor a 50 días, lo que parece muy poco probable. +1 para incluir una prueba sólida de este trabajo de una manera fácil de probar. StopWatch es una clase inútil, debido a los problemas con las CPU multi-core, que en la actualidad son prácticamente todas las computadoras. – eselk

+0

Nota: Este ejemplo solo funcionará cuando el código se genere sin verificación de desbordamiento/desbordamiento aritmético (está desactivado de manera predeterminada). Si lo enciende (Ajustes _Project> Crear> Opciones avanzadas ...> Comprobar si hay desbordamiento aritmético/underflow_) el código elevará 'System.OverflowException: operación aritmética dio lugar a un overflow' – Lu55

9

Si usted está buscando la funcionalidad de Environment.TickCount pero sin la sobrecarga de crear nuevos objetos Stopwatch, se puede utilizar el método estático Stopwatch.GetTimestamp() (junto con Stopwatch.Frequency) para calcular períodos de tiempo largos. Como GetTimestamp() devuelve long, no se desbordará durante mucho, mucho tiempo (más de 100.000 años, en la máquina que estoy utilizando para escribir esto). También es mucho más preciso que Environment.TickCount que tiene una resolución máxima de 10 a 16 milisegundos.

+0

Desafortunadamente 'Stopwatch.GetTimestamp()' no es tan conveniente como 'Environment.TickCount' porque devuelve algún lugar abstracto garrapatas que las unidades de tiempo ordinarias – Lu55

+0

Si hay consideraciones de alto rendimiento, uno debe tener en cuenta que 'Environment.TickCount' es considerablemente más rápido. Los puntos de referencia aquí (https://blog.tedd.no/2015/08/17/comparison-of-environment-tickcount-datetime-ticks-and-stopwatch-elapsedmilliseconds/) muestran los siguientes tiempos relativos: Environment.TickCount: * 7ms *, DateTime.Now.Ticks: * 1392ms *, Stopwatch.ElapsedMilliseconds: * 933ms *. –

+0

@SpecialSauce, pero tenga en cuenta que no son cosas equivalentes. También tenga en cuenta que en mi sistema, 'Stopwatch.ElapsedMilliseconds' es ~ 35 veces más rápido que su sistema, mientras que' Environment.TickCount' es solo ~ 2 veces más rápido. Su hardware puede (aparentemente) variar. – Mark

77

Environment.TickCount se basa en la función WinAPI GetTickCount(). Está en milisegundos Pero la precisión real es de aproximadamente 15,6 ms. Por lo tanto, no puede medir intervalos de tiempo más cortos (o obtendrá 0)

Nota: El valor devuelto es Int32, por lo que este contador rueda cada ~ 49,7 días. No deberías usarlo para medir tales intervalos largos.

DateTime.Ticks se basa en GetSystemTimeAsFileTime() función WinAPI. Está en 100 nanosegundos (décimas de microsoconds). La precisión real de DateTime.Ticks depende del sistema. En XP, el incremento del reloj del sistema es de aproximadamente 15,6 ms, el mismo que en Environment.TickCount. En Windows 7, su precisión es de 1 ms (mientras que Environemnt.TickCount sigue siendo de 15.6 ms); sin embargo, si se usa un esquema de ahorro de energía (generalmente en equipos portátiles) también puede bajar a 15.6 ms.

El cronómetro se basa en la función WinAPI QueryPerformanceCounter() (pero si su sistema no admite el contador de rendimiento de alta resolución, DateTime.Las garrapatas se utiliza)

Antes de utilizar aviso cronómetro dos problemas:

  • puede ser poco fiable en sistemas multiprocesador (véase MS kb895980, kb896256)
  • puede no ser fiable si la frecuencia de la CPU varía (leer this artículo)

se puede evaluar la precisión en su sistema con una simple prueba:

static void Main(string[] args) 
{ 
    int xcnt = 0; 
    long xdelta, xstart; 
    xstart = DateTime.UtcNow.Ticks; 
    do { 
     xdelta = DateTime.UtcNow.Ticks - xstart; 
     xcnt++; 
    } while (xdelta == 0); 

    Console.WriteLine("DateTime:\t{0} ms, in {1} cycles", xdelta/(10000.0), xcnt); 

    int ycnt = 0, ystart; 
    long ydelta; 
    ystart = Environment.TickCount; 
    do { 
     ydelta = Environment.TickCount - ystart; 
     ycnt++; 
    } while (ydelta == 0); 

    Console.WriteLine("Environment:\t{0} ms, in {1} cycles ", ydelta, ycnt); 


    Stopwatch sw = new Stopwatch(); 
    int zcnt = 0; 
    long zstart, zdelta; 

    sw.Start(); 
    zstart = sw.ElapsedTicks; // This minimizes the difference (opposed to just using 0) 
    do { 
     zdelta = sw.ElapsedTicks - zstart; 
     zcnt++; 
    } while (zdelta == 0); 
    sw.Stop(); 

    Console.WriteLine("StopWatch:\t{0} ms, in {1} cycles", (zdelta * 1000.0)/Stopwatch.Frequency, zcnt); 
    Console.ReadKey(); 
} 
+0

Solo una nota para tu bucle: en lugar de un bucle for, deberías usar 'Thread.SpinWait', esto asegurará que el bucle no se optimice (estás especificando que el bucle" waste "es lo que quieres semánticamente) Aparte de eso, debería ser más o menos equivalente al ciclo for. – Luaan

+0

@Luaan: gracias, he cambiado el código de muestra para mostrar la precisión. – mistika

+1

Explicación muy detallada. En mi computadora de escritorio win10, los resultados son similares a su informe de Win7. StopWatch parece de alta precisión. Fecha y hora: 1,0278 ms, en 21272 ciclos Medio ambiente: 16 ms, en ciclos 4786363 del cronómetro: 0,00087671156014329 ms, en 1 ciclos –

2

Environment.TickCount parece ser mucho más rápido que las otras soluciones:

Environment.TickCount 71 
DateTime.UtcNow.Ticks 213 
sw.ElapsedMilliseconds 1273 

Las mediciones se generan por el siguiente código:

static void Main(string[] args) { 
    const int max = 10000000; 
    // 
    // 
    for (int j = 0; j < 3; j++) { 
     var sw = new Stopwatch(); 
     sw.Start(); 
     for (int i = 0; i < max; i++) { 
      var a = Environment.TickCount; 
     } 
     sw.Stop(); 
     Console.WriteLine($"Environment.TickCount {sw.ElapsedMilliseconds}"); 
     // 
     // 
     sw = new Stopwatch(); 
     sw.Start(); 
     for (int i = 0; i < max; i++) { 
      var a = DateTime.UtcNow.Ticks; 
     } 
     sw.Stop(); 
     Console.WriteLine($"DateTime.UtcNow.Ticks {sw.ElapsedMilliseconds}"); 
     // 
     // 
     sw = new Stopwatch(); 
     sw.Start(); 
     for (int i = 0; i < max; i++) { 
      var a = sw.ElapsedMilliseconds; 
     } 
     sw.Stop(); 
     Console.WriteLine($"sw.ElapsedMilliseconds {sw.ElapsedMilliseconds}"); 
    } 
    Console.WriteLine("Done"); 
    Console.ReadKey(); 
} 
+0

+1 de mí, porque esto es, lo que quería saber. Si alguien está leyendo esto: ¿Por qué esta respuesta no tiene comentarios, y no hay otros votos hacia arriba/abajo? (a partir del 5/2017) Si algo no es correcto, por favor comente, si lo cree, esto es correcto, por favor vota. – Philm

+0

He extendido el punto de referencia, ver mi respuesta. Por cierto, hay diferencias interesantes, si ejecuta estos puntos de referencia en modo de liberación o depuración (este último probablemente no debería hacer para obtener resultados "reales", pero es interesante ver qué pruebas se optimizan realmente por el compilador y cuáles no).) – Philm

1

Aquí es una especie de resumen actualizado & actualizada de cuáles pueden ser las respuestas más útiles & comentarios en este tema + parámetros adicionales y variantes:

Primera cosa f Irst: Como otros han señalado en los comentarios, las cosas han cambiado en los últimos años y con el Windows "moderno" (Win XP ++) y .NET, y el hardware moderno no hay o hay pocas razones para no usar Stopwatch(). Ver MSDN para más detalles. Citas:?

"es la exactitud QPC afectados por los cambios de frecuencia del procesador causadas por la administración de energía o la tecnología Turbo Boost
No. Si el procesador tiene un TSC invariante, el QPC no se ve afectada por este tipo Si el procesador no tiene un TSC invariable, QPC revertirá a un temporizador de hardware de plataforma que no se verá afectado por los cambios de frecuencia del procesador o la tecnología Turbo Boost.

¿QPC funciona de manera confiable en sistemas multiprocesador? , sistema multi-core y sistemas con hiper-threading?

¿Cómo puedo determinar y validar que QPC funciona en mi máquina?
No necesita realizar tales comprobaciones.

¿Qué procesadores tienen TSC no invariables? [..Read más ..] "

Pero si usted no necesita la precisión de cronómetro() o al menos quiere saber exactamente sobre el rendimiento de cronómetro (estática vs instancia-based) y otras variantes posibles, continúe leyendo:

Tomé el punto de referencia anterior de cskwg, y extendí el código para más variantes. He medido con algunos años i7 4700 MQ y C# 7 con VS 2017 (para ser más preciso, compilado con .NET 4.5.2, a pesar de los literales binarios, es C# 6 (usado de esto: literales de cadena y 'usando estático'). Especialmente el rendimiento de Cronómetro() parece mejorar en comparación con el punto de referencia mencionado.

Este es un ejemplo de los resultados de 10 millones de repeticiones en un bucle, como siempre, los valores absolutos no son importantes, pero incluso los valores relativos pueden diferir en otro hardware:

32 bits, modo de lanzamiento sin optimización :

medidos: GetTickCount64() [ms]: 275
medido: Environment.TickCount [ms]: 45
medidos: DateTime.UtcNow.Ticks [ms]:
medidos: Cronómetro: .ElapsedTicks [ms]: 277
medidos: Cronómetro: .ElapsedMilliseconds [ms]: 548
medidos: estáticos Stopwatch.GetTimestamp [ms]: 193
Medido: Cronómetro + conversión a DateTime [ms ]: 551
compararlo con DateTime.Now.Ticks [ms]:

32 bits, de modo de liberación, optimizadas:

medidos: GetTickCount64() [ms]: 198
Medido: Environment.TickCount [ms]: 39
medidos: DateTime.UtcNow.Ticks [ms]: 66
medido (!): Cronómetro: .ElapsedTicks [ms]: 175
medidos: Cronómetro: .ElapsedMilliseconds [ms]:
medidos: estáticos Stopwatch.GetTimestamp [ms]: 175
medido: Cronómetro + de conversión a DateTime [ms]:
Com pare que con DateTime.Now.Ticks [ms]:

64 bit, modo de lanzamiento sin optimización:

medidos: GetTickCount64() [ms]: 205
Medido : Environment.TickCount [ms]: 39
medidos: DateTime.UtcNow.Ticks [ms]:
medidos: Cronómetro: .ElapsedTicks [ms]: 209
medidos: Cronómetro: .ElapsedMilliseconds [ms]: 285
medidos: estáticos Stopwatch.GetTimestamp [ms]: 187
Medido: Cronómetro + conversión a DateTime [ms]: 319
compararlo con DateTime.Now.Ticks [ms]: 3040

64 bits, de modo de liberación, optimizado:

medido: GetTickCount64() [ms]: 148
Medido: Medio Ambiente.TickCount [ms]: 31 (¿es todavía vale la pena?)
medidos: DateTime.UtcNow.Ticks [ms]: 76
medidos (!): Cronómetro: .ElapsedTicks [ms]: 178
medido: Cronómetro: .ElapsedMilliseconds [ms]: 226
medido: estáticos Stopwatch.GetTimestamp [ms]: 175
medido: Cronómetro + de conversión a DateTime [ms]: 246
compararlo con DateTime.Now.Ticks [ms ]: 3020

Puede ser muy interesante que creando un valor de DateTime para imprimir el tiempo del cronómetro no tenga casi ningún costo. Interesante en una forma más académica que práctica es que el cronómetro estático es ligeramente más rápido (como se esperaba). Algunos puntos de optimización son bastante interesantes. Por ejemplo, no puedo explicar por qué Stopwatch.ElapsedMilliseconds solo con 32 bits es tan lento en comparación con sus otras variantes, por ejemplo, la estática. Esto y DateTime.Now más del doble de su velocidad con 64 bit.

Puedes ver: solo para millones de ejecuciones, el tiempo de Stopwatch comienza a importar. Si este es realmente el caso (pero tenga cuidado micro-optimizando demasiado pronto), puede ser interesante que con GetTickCount64(), pero especialmente con DateTime.UtcNow, usted tiene un temporizador de 64 bits (largo) con menos precisión que Cronómetro, pero más rápido, para que no tenga que meterse con el entorno "feo" de 32 bits. TickCount.

Como era de esperar, DateTime.Now es de lejos el más lento de todos.

Si lo ejecuta, el código recupera también su precisión actual del cronómetro y más.

Este es el código de referencia completo:

using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 
using static System.Environment; 

[...]

[DllImport("kernel32.dll") ] 
    public static extern UInt64 GetTickCount64(); // Retrieves a 64bit value containing ticks since system start 

    static void Main(string[] args) 
    { 
     const int max = 10_000_000; 
     const int n = 3; 
     Stopwatch sw; 

     // Following Process&Thread lines according to tips by Thomas Maierhofer: https://codeproject.com/KB/testing/stopwatch-measure-precise.aspx 
     // But this somewhat contradicts to assertions by MS in: https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396#Does_QPC_reliably_work_on_multi-processor_systems__multi-core_system__and_________systems_with_hyper-threading 
     Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1); // Use only the first core 
     Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; 
     Thread.CurrentThread.Priority = ThreadPriority.Highest; 
     Thread.Sleep(2); // warmup 

     Console.WriteLine($"Repeating measurement {n} times in loop of {max:N0}:{NewLine}"); 
     for (int j = 0; j < n; j++) 
     { 
      sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < max; i++) 
      { 
       var tickCount = GetTickCount64(); 
      } 
      sw.Stop(); 
      Console.WriteLine($"Measured: GetTickCount64() [ms]: {sw.ElapsedMilliseconds}"); 
      // 
      // 
      sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < max; i++) 
      { 
       var tickCount = Environment.TickCount; // only int capacity, enough for a bit more than 24 days 
      } 
      sw.Stop(); 
      Console.WriteLine($"Measured: Environment.TickCount [ms]: {sw.ElapsedMilliseconds}"); 
      // 
      // 
      sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < max; i++) 
      { 
       var a = DateTime.UtcNow.Ticks; 
      } 
      sw.Stop(); 
      Console.WriteLine($"Measured: DateTime.UtcNow.Ticks [ms]: {sw.ElapsedMilliseconds}"); 
      // 
      // 
      sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < max; i++) 
      { 
       var a = sw.ElapsedMilliseconds; 
      } 
      sw.Stop(); 
      Console.WriteLine($"Measured: Stopwatch: .ElapsedMilliseconds [ms]: {sw.ElapsedMilliseconds}"); 
      // 
      // 
      sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < max; i++) 
      { 
       var a = Stopwatch.GetTimestamp(); 
      } 
      sw.Stop(); 
      Console.WriteLine($"Measured: static Stopwatch.GetTimestamp [ms]: {sw.ElapsedMilliseconds}"); 
      // 
      // 
      DateTime dt=DateTime.MinValue; // just init 
      sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < max; i++) 
      { 
       var a = new DateTime(sw.Elapsed.Ticks); // using variable dt here seems to make nearly no difference 
      } 
      sw.Stop(); 
      //Console.WriteLine($"Measured: Stopwatch+conversion to DateTime [s] with millisecs: {dt:s.fff}"); 
      Console.WriteLine($"Measured: Stopwatch+conversion to DateTime [ms]: {sw.ElapsedMilliseconds}"); 

      Console.WriteLine(); 
     } 
     // 
     // 
     sw = new Stopwatch(); 
     var tickCounterStart = Environment.TickCount; 
     sw.Start(); 
     for (int i = 0; i < max/10; i++) 
     { 
      var a = DateTime.Now.Ticks; 
     } 
     sw.Stop(); 
     var tickCounter = Environment.TickCount - tickCounterStart; 
     Console.WriteLine($"Compare that with DateTime.Now.Ticks [ms]: {sw.ElapsedMilliseconds*10}"); 

     Console.WriteLine($"{NewLine}General Stopwatch information:"); 
     if (Stopwatch.IsHighResolution) 
      Console.WriteLine("- Using high-resolution performance counter for Stopwatch class."); 
     else 
      Console.WriteLine("- Using high-resolution performance counter for Stopwatch class."); 

     double freq = (double)Stopwatch.Frequency; 
     double ticksPerMicroSec = freq/(1000d*1000d) ; // microsecond resolution: 1 million ticks per sec 
     Console.WriteLine($"- Stopwatch accuracy- ticks per microsecond (1000 ms): {ticksPerMicroSec:N1}"); 
     Console.WriteLine(" (Max. tick resolution normally is 100 nanoseconds, this is 10 ticks/microsecond.)"); 

     DateTime maxTimeForTickCountInteger= new DateTime(Int32.MaxValue*10_000L); // tickCount means millisec -> there are 10.000 milliseconds in 100 nanoseconds, which is the tick resolution in .NET, e.g. used for TimeSpan 
     Console.WriteLine($"- Approximated capacity (maxtime) of TickCount [dd:hh:mm:ss] {maxTimeForTickCountInteger:dd:HH:mm:ss}"); 
     // this conversion from seems not really accurate, it will be between 24-25 days. 
     Console.WriteLine($"{NewLine}Done."); 

     while (Console.KeyAvailable) 
      Console.ReadKey(false); 
     Console.ReadKey(); 
    } 
Cuestiones relacionadas