2010-02-26 9 views
9
Debug.WriteLine("Timer is high-resolution: {0}", Stopwatch.IsHighResolution); 
    Debug.WriteLine("Timer frequency: {0}", Stopwatch.Frequency); 

Risultato: (! Dal 2005)Perché la frequenza del mio cronometro è bassa?

Timer is high-resolution: True 
    Timer frequency: 2597705 

This articolo cita una frequenza di 3.579.545, un milione in più del mio. Il post sul blog This menziona una frequenza di 3.325.040.000, che è folle.

Perché la mia frequenza è relativamente più bassa? Sono su una macchina i7 920, quindi non dovrebbe essere più veloce?

+1

È un laptop? Spesso la frequenza di clock di una macchina viene ridimensionata in base allo stato della batteria/alimentazione. – Nick

+0

È un desktop. Ho le impostazioni di alimentazione impostate sulla modalità Prestazioni elevate; la frequenza di clock del processore è predefinita (2,66 GHz). –

risposta

22

3,579,545 è il numero magico . Questa è la frequenza in Hertz prima di dividerlo per 3 e di inserirlo nel chip del timer 8053 nel PC IBM originale. Il numero dispari non è stato scelto per caso, è la frequenza dello color burst signal nel sistema TV NTSC utilizzato negli Stati Uniti e in Giappone. Gli ingegneri IBM stavano cercando un cristallo economico per implementare l'oscillatore, niente era più economico di quello usato in ogni TV.

Una volta che i cloni IBM sono diventati ampiamente disponibili, era ancora importante per i progettisti scegliere la stessa frequenza. Un sacco di software MS-DOS si basava sul ticchettio del timer a quella velocità. Affrontare direttamente il chip era un crimine comune.

Ciò è cambiato dopo l'arrivo di Windows. Una versione di Windows 2 è stata la prima a virtualizzare il chip del timer. In altre parole, al software non era più consentito indirizzare direttamente il chip del timer. Il processore è stato configurato per l'esecuzione in modalità protetta e ha intercettato il tentativo di utilizzare l'istruzione I/O. Eseguendo invece il codice del kernel, consentendo di simulare il valore di ritorno dell'istruzione. Ora era possibile avere più programmi usando il timer senza che si calpestassero l'un l'altro. Un primo passo importante per rompere la dipendenza da come l'hardware è effettivamente implementato.

L'API Win32 (Windows NT 3.1 e Windows 95) ha formalizzato l'accesso al timer con un'API, QueryPerformanceCounter() e QueryPerformanceFrequency(). Un componente a livello di kernel, l'Hardware Adaption Layer, consente al BIOS di passare tale frequenza. Ora era possibile per i progettisti dell'hardware abbandonare realmente la dipendenza dalla frequenza esatta. Ci è voluto molto tempo, intorno al 2000 la stragrande maggioranza delle macchine aveva ancora il tasso di eredità.

Ma l'infinita ricerca per ridurre i costi in PC design ha messo fine a questo.Al giorno d'oggi, il progettista dell'hardware sceglie solo qualsiasi frequenza che sia prontamente disponibile nel chipset. 3.325.040.000 sarebbero un numero tale, probabilmente è il tasso di clock della CPU. Le alte frequenze del genere sono comuni nei design economici, specialmente quelli che hanno un core AMD. Il tuo numero è piuttosto insolito, alcune probabilità che la tua macchina non sia economica. E che il timer è molto più preciso, i clock della CPU hanno le tipiche tolleranze dei componenti elettronici.

+0

nobugz, grazie per la risposta dettagliata. Potresti espandere il tuo ultimo paragrafo? Mi sembra che una frequenza più alta garantisca una maggiore precisione: con una freq. di 3,3 ghz, sono a risoluzione di 3 nanosecondi, mentre con il mio freq., sono a 385 ns. –

+3

Beh, hai una risoluzione molto inferiore. Ma il tuo timer è probabilmente molto più preciso. La frequenza di clock della CPU a 3,3 GHz è in genere accurata solo del 10%. Non lo so per certo, dipende da come viene generato il segnale. Tutto ciò che funziona a un megahertz o meglio è abbastanza buono per il software di cronometraggio, il jitter dovuto al threading è molto peggiore di quello. –

+0

@SamPearson Probabilmente il tizio del secondo post, con 3.325.040.000 zecche al secondo, aveva "Stopwatch.IsHighResolution" impostato su False, poiché il suo sistema utilizzava direttamente il "clock" della CPU, con una precisione del ± 10% secondo Hans. Se questo è il significato di "IsHighResolution", penso che la scelta del termine "risoluzione" sia sfortunata, dal momento che chiaramente 3.325.040.000 conteggi al secondo è una "risoluzione" maggiore di 2.597.705 conteggi al secondo. La risoluzione è qualcos'altro che precisione o incertezza. –

6

La frequenza dipende dall'HAL (Hardware abstraction layer). Tornando ai giorni del pentium, era normale usare il tick della CPU (che era basato sul clock rate della CPU), quindi si è finito con timer ad alta frequenza.

Con macchine multiprocessore e multi-core, e in particolare con CPU a velocità variabile (l'orologio della CPU rallenta per stati di bassa potenza) utilizzando il tick della CPU quando il timer diventa difficile e soggetto a errori, quindi gli scrittori dell'HAL sembra che abbia scelto di usare un orologio hardware più lento, ma più affidabile, come l'orologio in tempo reale.

1

Il valore di Cronometro. Frequenza al secondo, quindi la frequenza di 2.597.705 significa che hai più di 2,5 milioni di zecche al secondo. Esattamente quanto precisione hai bisogno?

Per quanto riguarda le variazioni di frequenza, è una cosa dipendente dall'hardware. Alcune delle differenze hardware più comuni sono il numero di core, la frequenza di ogni core, lo stato corrente della CPU (o core), se hai abilitato il sistema operativo a regolare dinamicamente la frequenza della CPU, ecc. La tua frequenza non sarà sempre lo stesso, e a seconda di quale stato è la tua CPU quando lo controlli, potrebbe essere inferiore o superiore, ma generalmente intorno allo stesso (per te, probabilmente circa 2,5 milioni.)

1

Penso che 2,597,705 = la frequenza del processore. Myne è 2.737.822. i7 930

+2

Difficilmente. 2.6 MHz sarebbe una frequenza di processore piuttosto lenta in questi giorni;) –

+0

Yeap, hai ragione! Perdonami per quello. Il ragazzo ha fatto qualcosa di sbagliato. Penso che il cronometro non funzioni molto bene in modalità di debug. – Pedro77

+0

:). Cronometro e debug ... tanti articoli su cui vorrei puntare ... si tratta di -> misurare le prestazioni è ** molto ** difficile. Solo per divertimento: la mia frequenza: 3.320.390, I7 2600k. – Noctis

Problemi correlati