2010-04-06 5 views
9

Alla pagina MSDN per Stopwatch class ho scoperto link per interesting article che rende seguente dichiarazione su Stopwatch:Stopwatch è davvero rotto?

Tuttavia ci sono alcuni problemi seri:

  • questo può essere inaffidabile su un PC con più processori. A causa di un bug in
    , il BIOS, Start() e Stop() devono essere eseguiti sullo stesso processore per ottenere un risultato corretto.

  • Questo non è affidabile per i processori che non hanno un clock costante velocità (la maggior parte dei processori può ridurre la velocità di clock per risparmiare energia ). Questo è spiegato in dettaglio here.

Sono po 'confuso. Ho visto tons of examples di usare Cronometro e nessuno menziona questo inconveniente. Quanto è serio questo? Dovrei evitare di usare il cronometro?

risposta

2

Non è rotto ha solo limitazioni. Per la maggior parte degli scopi (leggi: micro-benchmark informale) StopWatch va bene semplicemente perché è abbastanza buono per i test informali. Per scopi più formali, è molto probabile che si desideri eseguire il proprio codice di strumentazione, poiché si farebbe molto di più per ottenere risultati corretti.

2

domande più interessanti sono:

  1. in quali condizioni si fermerà() essere eseguita su un processore diverso da quello di inizio()?
    .
    Nella maggior parte degli scenari di applicazione, la risposta è "nessuno".

  2. in quali condizioni cambierà la velocità di clock di un processore durante un intervallo misurato?
    .
    In benchmark intensivi della CPU, "nessuno".

+0

In caso di parametri di riferimento intensivi della CPU, probabilmente avete ragione. Ma in caso di oggetti I/O asincroni può essere completamente diverso. –

+0

Non sono d'accordo con la tua prima affermazione. Avevo uno di quei computer rotti e si presentava abbastanza spesso. Si è persino schiantato i giochi a causa del tempo che va indietro. – CodesInChaos

2

Vedi le note in MSDN articolo:

in un computer multiprocessore, non importa quale processore il thread viene eseguito su. Tuttavia, a causa di bug nel BIOS o HAL (Hardware Abstraction Layer), è possibile ottenere risultati di temporizzazione diversi su processori diversi. Per specificare l'affinità del processore per un thread, utilizzare il metodo ProcessThread.ProcessorAffinity.