2011-12-28 11 views
15

Czy godzina System.Diagnostics.Stopwatch liczyć czas podczas komputera stać?Czy .NET Stoper działa w trybie gotowości/uśpienia/hibernacji?

+0

Ciekawe pytanie, Użyłem Stopwatch tylko do profilowania biednych ludzi, więc nigdy nie przyszło mi to do głowy. – Davy8

+4

Dobre pytanie .... wypróbuj i daj nam znać :) –

+0

Jak widać z odpowiedzi, jest to zachowanie specyficzne dla implementacji. Licznik jest opakowany przez warstwę abstrakcji sprzętu systemu operacyjnego, dając projektantom sprzętu wiele opcji do cięcia groszy. –

Odpowiedz

3

Tak robi.

Patrząc na kod reflektor pokazuje, że jeśli nie jest Stopwatch.IsHighResolution, następnie użyje liczbę kleszczy (w moim środowisku, wartość była false więc będzie używać 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

Tak, robi. Ale bardzo niedokładne. Zobacz moją odpowiedź. –

3

Po kilku próbach numer wyświetla się jako, ale był już odłogowany. To, co zrobiłem:

  1. napisał poniższy kod
  2. Ran, i natychmiast umieścić mój komputer w uśpienia trybu
  3. Czekaliśmy 10 sekund i przyniósł mój komputer z powrotem

Rezultatem był szokujący czas Elapsed wynoszący ponad 4 minuty. Daleko. Więc nie użyłbym tego jako jakiegokolwiek punktu odniesienia.

Oto kod użyłem:

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(); 
     } 
    } 
} 
Powiązane problemy