2010-01-31 6 views
6

Ich weiß, dass diese Frage ein paar Mal über SO gestellt wurde, aber keiner von ihnen hilft mir wirklich, also frag wieder.Berechne die Zeit mit dem C++ Code

Ich verwende Windows XP und Ausführen von Visual Studio C++ 2008

Der gesamte Code, die ich suche ist time.h verwenden, aber ich denke, kann es nicht richtig, hier zu arbeiten, weil die Ergebnisse machen mich misstrauisch.

Also das ist was ich will.

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

, was Sie "verdächtig" macht? –

+0

its me Rückkehr „0“ – itsaboutcode

+1

Ihr Code ausgeführt wird zu schnell für die Präzision von time.h es zu fangen - eine Lösung verwenden, mehr Präzision gewähren (siehe meine Antwort) –

Antwort

8

Hier ist, was ich verwende, um Zeit in Millisekunden zu drucken.

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; 
} 

es wie folgt verwendet:

_int64 t1; 

    StartTimer(&t1); 

    // do some stuff 

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

Ich denke, das hat mein Problem gelöst. Danke, Mark. – itsaboutcode

4

Sie benötigen einen hochpräzisen Timer. Im Falle von Visual Studio verwenden Sie QueryPerformanceCounter.

Wenn die Genauigkeit immer noch nicht genug ist, Compiler intristics verwenden:

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

unsigned __int64 ticks = __rdtsc(); 

Infos siehe auf diesem intristic here.

Beide Lösungen sind nur Windows, letzteres ist wahrscheinlich nur MSVC. Ich kann eine ähnliche Lösung für GCC/Linux bei Bedarf veröffentlichen.

+0

, wie ich es auf Millisekunden umwandeln kann? – itsaboutcode

+0

@itsaboutcode, leider mit solchen Low-Level-Performance-Funktionen, gibt es keine sichere Möglichkeit, es in Millisekunden zu konvertieren, als das Ergebnis ist abhängig von Ihrer Prozessorgeschwindigkeit. Sie können einen Ticks/Sekunde-Wert mit Sleep vorher berechnen und dann die Konvertierung durchführen. –

+2

Vorsicht bei Verwendung von RDTSC auf Multicore- oder Multisocket-Systemen! Jeder CPU-Kern in einem System hat einen separaten Zähler Zeitstempel und sie könnten oder synchron sein könnten nicht. Im Allgemeinen muss ein Treiber vorhanden sein, der die Zeitstempelzähler über die Kerne hinweg regelmäßig synchronisiert. Sofern Sie nicht ausdrücklich die Threadaffinität des Prozesses festgelegt, ist das Betriebssystem frei, um es von einem Kern zu einem anderen zu bewegen. Wenn die TSCs der Kerne nicht synchron sind, können Sie Ihre Start- und Stoppzeiten von verschiedenen Zählern abrufen, und der Unterschied kann drastisch falsch sein - sogar negativ! –

1

Wenn Sie unter Windows arbeiten, ist die GetTickCount()-Funktion eine praktische Möglichkeit, einen Timer mit einer höheren Auflösung als 1 Sekunde zu erhalten. Die Auflösung von GetTickCount hängt von Ihrem Betriebssystem ab, liegt aber wahrscheinlich zwischen 10 ms und 16 ms.

Beachten Sie, dass es für schnelle Operationen nicht ausreicht, Ihren Code einmal auszuführen. Ihr Code könnte in etwa 0,02 ms laufen, was bedeutet, dass Sie von einem Counter wie GetTickCount 0 erhalten. Ihr Code wird möglicherweise nicht lange genug ausgeführt, damit der Timer den nächsten Wert annimmt. Die Lösung besteht darin, Ihren Code millionenfach in einer Schleife laufen zu lassen, die gesamte Menge zu verteilen und dann durch eine Million zu teilen.

+0

Ich verwende diese Funktion aber kein Ergebnis. – itsaboutcode

+0

@itsaboutcode: Und wie oft führen Sie Ihren Code zwischen dem Erfassen von "Start" und "Ende" mal? –

+0

Nur einmal, ist das wichtig, sein sehr langer Code ... wie 6 Funktionen und insgesamt 250 Zeilen Code. – itsaboutcode

0

Kornel Vorschlag der Verwendung von Queryperformancecounter ein ausgezeichneter ist.

Wenn das für Sie nicht funktioniert und Sie eine andere Windows-Lösung nicht stören, verwenden Sie die Windows- "Multimedia-Timer". Durchsuchen Sie die Visual Studio-Hilfedateien nach "timeBeginPeriod", "timeEndPeriod" und "Verwenden von Multimedia-Timern".

das Multimedia-Timer verwenden, können Sie den Kopf- und Link mit Winmm.lib umfassen müssen:

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

Normalerweise tun Menschen so etwas wie dies einiges kleines Zeitintervall zu messen:

t0 = getTime(); 

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

t1 = getTime(); 

timePassed = (t1-t0)/1000000; 
0

Arbeits Dies wird

#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 ; 
Verwandte Themen