2010-06-29 7 views
-1

J'ai essayé clock_gettime(CLOCK_REALTIME) et gettimeofday() sans chance - Et le plus fondamental comme clock(), ce qui me renvoie 0 (?).Fonction définitive pour obtenir le temps écoulé en millisecondes

Mais aucun d'entre eux ne compte le temps passé en sommeil. Je n'ai pas besoin d'une minuterie haute résolution, mais j'ai besoin de quelque chose pour obtenir le temps écoulé en ms.

EDIT: Programme final:

#include <iostream> 
#include <string> 
#include <time.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

using namespace std; 

// Non-system sleep (wasting cpu) 
void wait (int seconds) 
{ 
    clock_t endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait) {} 
} 

int show_time() { 
    timeval tv; 
    gettimeofday(&tv, 0); 
    time_t t = tv.tv_sec; 
    long sub_sec = tv.tv_usec; 

    cout<<"t value: "<<t<<endl; 
    cout<<"sub_sec value: "<<sub_sec<<endl; 
} 

int main() { 
    cout<<show_time()<<endl; 
    sleep(2); 
    cout<<show_time()<<endl; 
    wait(2); 
    cout<<show_time()<<endl; 
} 

Répondre

4

Vous devez essayer gettimeofday() encore, il compte certainement le temps d'horloge murale, il compte lorsque le sommeil processus.

long long getmsofday() 
{ 
    struct timeval tv; 
    gettimeofday(&tv); 
    return (long long)tv.tv_sec*1000 + tv.tv_usec/1000; 
} 


... 

long long start = getmsofday(); 
do_something(); 
long long end = getmsofday(); 

printf("do_something took %lld ms\n",end - start); 
+0

Il est à noter que est nécessaire pour gettimeofday. – stinky472

+0

Je l'ai revérifié et je l'ai obtenu pour fonctionner parfaitement avec gettimeofday! Je pense que je faisais quelque chose de mal ... Je vais mettre à jour la question avec mon programme de test final. Merci! – NeDark

+1

Il devrait être 'tv.tv_sec * 1000 + ..' –

2

Votre problème concerne probablement la division intégrale. Vous devez convertir l'un des opérandes de division en float/double pour éviter la troncature des valeurs décimales moins d'une seconde.

clock_t start = clock(); 
// do stuff 

// Can cast either operand for the division result to a double. 
// I chose the right-hand operand, CLOCKS_PER_SEC. 
double time_passed = clock()/static_cast<double>(CLOCKS_PER_SEC); 

[Modifier] Comme indiqué, l'horloge() mesure le temps CPU (cycles/horloge tiques) et ne convient pas bien adapté pour les tests de minuterie murale. Si vous voulez une solution portable pour cela, @see Boost.Timer comme une solution possible

1

Vous voulez réellement clock_gettime(CLOCK_MONOTONIC, ...).

Questions connexes