2011-12-28 9 views
15

Il tempo di conteggio System.Diagnostics.Stopwatch durante l'attesa del computer?.NET Stopwatch standby/sospensione/ibernazione è in funzione?

+0

Domanda interessante, Ho sempre usato Cronometro solo per la profilazione di un uomo povero, quindi non mi è mai venuto in mente. – Davy8

+4

Buona domanda .... provalo e facci sapere :) –

+0

Come puoi vedere dalla risposta, questo è un comportamento specifico dell'implementazione. Il contatore è avvolto dal Hardware Abstraction Layer del sistema operativo, offrendo ai progettisti dell'hardware numerose opzioni per tagliare i penny. –

risposta

3

sì lo fa.

Guardando il codice in Reflector dimostra che se non è Stopwatch.IsHighResolution, allora sarà utilizzare il conteggio tick (nel mio ambiente, il valore era false quindi userà 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 fa. Ma molto impreciso. Vedi la mia risposta. –

3

In realtà, dopo un po 'di test, lo appare conteggio, ma era lontano. Questo è quello che ho fatto:

  1. scritto il codice qui sotto
  2. lo gestisce, e subito messo il mio computer in sospensione modalità
  3. aspettato 10 secondi e ha portato il mio computer back up

Il risultato è stato un sorprendente periodo di Elapsed di oltre 4 minuti. Lontano. Quindi non lo userei come alcun tipo di benchmark.

Ecco il codice che ho usato:

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(); 
     } 
    } 
} 
Problemi correlati