2011-12-07 12 views

risposta

4

In Windows 7 su processori di generazione corrente, questo è un timer affidabile ad alta precisione (nanosecondo) all'interno della CPU (HPET).

In versioni precedenti e su generazioni precedenti di processori, è "qualcosa", che può significare praticamente qualsiasi cosa. Più comunemente, è il valore restituito dall'istruzione RDTSC (o un equivalente, su non x86), che può essere o meno affidabile e indipendente dall'orologio. Nota che RDTSC (in origine, per definizione, ma non più ora) non misura il tempo , misura cicli.

Nelle CPU attuali-and-precedente generazione, RDTSC solito è affidabile e orologio indipendente (cioè è ora veramente tempo di misura), sulla pre generazione -precedente, specialmente sul mobile o qualche multi-CPU le piattaforme non lo sono. Il "timer" può accelerare e decelerare, e persino essere diverso su diverse CPU, causando "viaggi nel tempo".

Edit: Il constant tsc bandiera nella CPUID (0x80000007) può essere utilizzato per dire se RDTSC è affidabile o meno (anche se questo in realtà non risolve il problema, perché che cosa fare se non lo è, se c'è senza alternative...).

Su sistemi ancora più vecchi (come 8-10 anni), è possibile utilizzare altri timer per QueryPerformanceCounter. Quelli possono non avere affatto un'alta risoluzione, né essere terribilmente accurati.

+0

Rif .: "Si noti che RDTSC non misura il tempo, misura i cicli.", È importante notare che è possibile calcolare il tempo in secondi direttamente come "freq * tick". – Polynomial

+1

@Polynomial: no, non è possibile, perché freq! = Const. Su praticamente tutti i sistemi oggi (e la maggior parte dei sistemi nell'ultima decade) la frequenza viene scalata dinamicamente per risparmiare energia. – Damon

+0

Interessante. Qual è l'alternativa? – Polynomial

1

I contatori di prestazioni ad alta risoluzione vengono solitamente estratti dall'istruzione rdtsc, che è un modo specifico x86 di recuperare il numero di ticks della CPU verificatisi dall'avvio. Il valore di questo è molto preciso, di solito fino a 100ns di precisione.

Confronta questo a GetTickCount(), che ha una precisione di circa ~ 16 ms.

Su altre architetture (che non rientrano nell'ambito delle API Win32, poiché vengono eseguite solo su set di istruzioni basate su x86), potrebbero esserci diversi modi per farlo. Ad esempio, su ARM è possibile utilizzare il System Control Coprocessor (CP15) per fare qualcosa di simile.

+0

+1 per "solitamente" come fino a HAL per decidere cosa utilizzare –

+0

@AlexK. - Sì, è in definitiva fino alla HAL. Su x86, però, non vedo un motivo per usare qualcosa di diverso da rdtsc perché è così preciso. Se ricordo bene, utilizza lo stesso clock sorgente utilizzato per eseguire gli interrupt, che sono programmati in modo ridicolo e accurato. – Polynomial

+0

@Polynomial: vedere la mia risposta per una buona ragione per cui RDTSC non dovrebbe essere utilizzato, a meno che non si garantisca che i propri clienti non utilizzino una CPU che ha 4 o 5 anni. RDTSC è solo preciso e preciso su CPU _some_, non necessariamente tutto (e non è possibile controllare realmente su quale CPU viene eseguito il programma). – Damon

Problemi correlati