2009-03-08 7 views
2

Ich muss in C++ auf Linux (und anderen Unix-ähnlichen Systemen), die CPU (nicht Wanduhr) Zeit von einer langen Berechnung genommen, also verwende ich Uhr() . Problem: Bei 32-Bit-Systemen ist dies nach etwa 2000 oder 4000 Sekunden der Fall.32 Bit Linux Clock() Überlauf

Was ist die empfohlene Problemumgehung dafür?

Antwort

12

Sie wollen getrusage verwenden, die die folgende Struktur füllt:

struct rusage { 
    struct timeval ru_utime; /* user time used */ 
    struct timeval ru_stime; /* system time used */ 
    ... 
}; 

Zur Vervollständigung struct timeval:

struct timeval { 
    time_t  tv_sec;  /* seconds */ 
    suseconds_t tv_usec; /* microseconds */ 
}; 

Wie immer finden Sie in der Manpage für Details (man getrusage)

1

Benötigen Sie die Genauigkeit von clock()? Wenn nicht, können Sie time() zweimal und nehmen den Unterschied verwenden:

time_t start, end; 
double diff; 

time(&start); 
// Do your stuff... 
time(&end); 
diff = difftime(end, start); 

EDIT:time() misst die Echtzeit (nicht CPU-Zeit) als litb wies in seinem Kommentar, aber so tut clock(). Wenn Sie die CPU-Zeit messen möchten, sollten Sie dem Rat von littb folgen und getrusage() verwenden.

+0

ist keine Zeitmessung Wanduhrzeit? Es ist nicht weniger, wenn Ihr Programm weniger CPU verwendet. es misst echte Sekunden von 1970. –

+0

das ist richtig, aber so tut Uhr() –

+0

gut als niemand scheint dich zu korrigieren, ich werde es wieder tun: Uhr ist nicht Wanduhrzeit. es gibt "eine Approximation der Prozessorzeit zurück, die vom Programm verwendet wird". –

-1

Erhalten Sie die Zeit auf einer wiederkehrenden Basis und erhöhen Sie auch eine Multiplikatorvariable int jedes Mal, wenn es rollt?

1

Ein weiterer Eine mögliche Methode besteht darin, gettimeofday() zweimal zu verwenden, da sie ms Genauigkeit zurückgibt.