2011-12-28 1012 views
15

¿System.Diagnostics.Stopwatch cuenta el tiempo durante la espera de la computadora?¿Está consciente el cronómetro en espera/dormir/hibernar de .NET?

+0

Interesante pregunta, Solo he usado Cronómetro para los perfiles de los pobres, así que esto nunca se me ocurrió. – Davy8

+4

Buena pregunta ... pruébelo y háganos saber :) –

+0

Como puede ver en la respuesta, este es un comportamiento específico de implementación. El contador está envuelto por la capa de abstracción de hardware del sistema operativo, lo que brinda a los diseñadores de hardware muchas opciones para ahorrar dinero. –

Respuesta

3

sí lo hace.

Si examina el código en el reflector muestra que si no es Stopwatch.IsHighResolution, a continuación, se utiliza el recuento de paso (en mi entorno, el valor era false por lo que utilizará DateTime.UtcNow.Ticks):

public void Start() 
{ 
    if (!this.isRunning) 
    { 
     this.startTimeStamp = GetTimestamp(); 
     this.isRunning = true; 
    } 
} 



public static long GetTimestamp() 
{ 
    if (IsHighResolution) 
    { 
     long num = 0L; 
     SafeNativeMethods.QueryPerformanceCounter(out num); 
     return num; 
    } 
    return DateTime.UtcNow.Ticks; 
} 
+0

Sí, lo hace. Pero muy inexacto. Ver mi respuesta –

3

En realidad, después de un poco de prueba, aparece para contar, pero estaba muy lejos. Esto es lo que hice:

  1. escribió el código de abajo
  2. Ran, e inmediatamente poner mi ordenador en sueño modo
  3. esperamos 10 segundos y traído mi equipo vuelva

El resultado fue un sorprendente Elapsed tiempo de más de 4 minutos. Lejos. Entonces no usaría esto como ningún tipo de punto de referencia.

Aquí está el código utilicé:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 

namespace TestingCode 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stopwatch testing = new Stopwatch(); 

      testing.Start(); 

      Console.WriteLine("Press any key to stop timer"); 
      Console.ReadKey(); 

      testing.Stop(); 

      Console.WriteLine("Elapsed: {0}", testing.Elapsed); 

      Console.WriteLine("Done!!"); 
      Console.ReadKey(); 
     } 
    } 
}