2010-01-31 43 views
6

So che questa domanda è stata posta più volte su SO, ma nessuno di questi mi sta davvero aiutando, quindi chiedo di nuovo.Calcolo del tempo con il codice C++

Sto usando Windows XP e in esecuzione Visual Studio C++ 2008.

Tutto il codice che sto cercando sta usando time.h ma penso che potrebbe essere il suo non funziona correttamente qui, perché i risultati mi stanno facendo sospetto.

Quindi questo è quello che voglio.

star time = get time some how (this is my question) 

my code 

end time = get time some how (this is my question) 

time passed = start time - end time 
+0

quello che sta facendo si "sospetta"? –

+0

mi restituisce "0" – itsaboutcode

+1

il codice viene eseguito troppo velocemente per la precisione di time.h per catturarlo - utilizzare una soluzione che garantisce maggiore precisione (vedere la mia risposta) –

risposta

8

Ecco cosa utilizzo per stampare il tempo in millisecondi.

void StartTimer(_int64 *pt1) 
{ 
    QueryPerformanceCounter((LARGE_INTEGER*)pt1); 
} 

double StopTimer(_int64 t1) 
{ 
    _int64 t2, ldFreq; 

    QueryPerformanceCounter((LARGE_INTEGER*)&t2); 
    QueryPerformanceFrequency((LARGE_INTEGER*)&ldFreq); 
    return ((double)(t2 - t1)/(double)ldFreq) * 1000.0; 
} 

usare in questo modo: il suggerimento

_int64 t1; 

    StartTimer(&t1); 

    // do some stuff 

    printf("Time = %.3f\n", StopTimer(t1)); 
+0

Penso che questo abbia risolto il mio problema. Grazie Marco. – itsaboutcode

4

È necessario un timer di alta precisione. In caso di Visual Studio, utilizzare QueryPerformanceCounter.

Se la precisione non è ancora sufficiente, utilizzare intristics compilatore:

#include <intrin.h> 
#pragma intrinsic(__rdtsc) 

unsigned __int64 ticks = __rdtsc(); 

Altre informazioni su quel intristic here.

Entrambe le soluzioni sono solo per Windows, l'ultima è probabilmente solo MSVC. Posso pubblicare una soluzione simile per GCC/Linux, se necessario.

+0

Come posso convertirlo in millisecondi? – itsaboutcode

+0

@itsaboutcode, sfortunatamente con funzioni di prestazioni di basso livello, non esiste un modo sicuro per convertirlo in millisecondi, poiché il risultato è diverso a seconda della velocità del processore. È possibile calcolare un tick/secondo valore utilizzando la funzione Sleep before hand, quindi eseguire la conversione. –

+2

Attenzione se si utilizza RDTSC su sistemi multicore o multisocket! Ogni core di cpu in un sistema ha un contatore di data/ora separato e potrebbero essere sincronizzati o meno. In generale, è necessario un driver che sincronizzi periodicamente i contatori di timestamp attraverso i core. Se non si imposta esplicitamente l'affinità del thread del processo, il sistema operativo è libero di spostarlo da un nucleo all'altro. Se i TSC dei core non sono sincronizzati, è possibile ottenere i tempi di avvio e di arresto da contatori diversi e la differenza può essere drasticamente errata, anche negativa! –

1

Se sei su Windows, la funzione GetTickCount() è un modo pratico per ottenere un timer con più risoluzione di 1 secondo. La risoluzione di GetTickCount dipende dal sistema operativo in uso, ma probabilmente è compresa tra 10 e 16 ms.

Nota che per operazioni rapide, fare il tuo codice una volta non sarà sufficiente. Il tuo codice potrebbe essere eseguito come 0,02 ms, il che significa che otterrai 0 da un contatore come GetTickCount. Il tuo codice potrebbe non essere eseguito abbastanza a lungo affinché il timer possa "spuntare" sul valore successivo. La soluzione è eseguire il tuo codice in un ciclo un milione di volte o qualsiasi altra cosa, cronometrare l'intero lotto, quindi dividerlo per un milione.

+0

Sto usando questa funzione ma nessun risultato. – itsaboutcode

+0

@itsaboutcode: quante volte state eseguendo il codice tra l'acquisizione delle ore "inizio" e "fine"? –

+0

Solo una volta, è questo il suo codice molto lungo ... come 6 funzioni e in totale 250 righe di codice. – itsaboutcode

0

di Kornel di utilizzare QueryPerformanceCounter è eccellente.

Se ciò non funziona per te e non ti dispiace un'altra soluzione per Windows, utilizza i "timer multimediali" di Windows. Cerca i file della guida di Visual Studio per "timeBeginPeriod", "timeEndPeriod" e "Using Multimedia Timers".

Per utilizzare i timer multimediali, è necessario includere l'intestazione e il legame con Winmm.lib:

#include <mmsystem.h> 
#pragma comment(lib, "winmm")  // need this library for multimedia timers 
1

Di solito la gente fare qualcosa di simile per misurare qualche piccolo intervallo di tempo:

t0 = getTime(); 

for(int i = 0; i<1000000; ++i) { 
    your code 
} 

t1 = getTime(); 

timePassed = (t1-t0)/1000000; 
0

Questo è il lavoro

#include <windows.h> 

SYSTEMTIME startTime; 
GetSystemTime(&startTime); 
WORD startmillis = (startTime.wSecond * 1000) + startTime.wMilliseconds; 

// Do some stuff 

SYSTEMTIME endTime; 
GetSystemTime(&endTime); 
WORD endmillis = (endTime.wSecond * 1000) + endTime.wMilliseconds; 

WORD millis = startmillis - endmillis ; 
Problemi correlati