2015-12-17 14 views
5

Sto provando a cronometrare un codice che ho in C++. Ho un ciclo interno e uno esterno che voglio separare a tempo, ma allo stesso tempo. Per qualche ragione quando lo faccio, una delle istanze restituisce 1.84467e + 13 e sempre questo numero esatto.Perché clock() restituisce 1.84467e + 13?

Perché sta succedendo?

Ecco un esempio minimale e funzionante, che replica l'effetto sulla mia macchina:

#include <iostream> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 

int main() 
{ 
    long int i, j; 
    clock_t start, finish, tick, tock; 
    double a = 0.0; 
    double adding_time, runtime; 

    start = clock(); 
    for(i=0; i<10; i++) 
    { 
     a=0.0; 
     tick =clock(); 
     for(j=0; j<10000000; j++) 
     { 
      a+=1; 
     } 
     tock= clock(); 
     adding_time = (double)(tick - tock)/CLOCKS_PER_SEC; 
     cout << "Computation time:" << adding_time << endl; 

    } 
    finish = clock(); 
    runtime = (double)(finish - start)/CLOCKS_PER_SEC; 
    cout << "Total computation time:" << runtime << endl; 
} 
+0

L'uscita non è esattamente la stessa cosa! – user1436187

+0

se si desidera una precisione elevata, non utilizzare 'clock()'. [Timer ad alta risoluzione multipiattaforma C++] (http://stackoverflow.com/q/1487695/995714), [C++ misurazione del tempo ad alta precisione in Windows] (http://stackoverflow.com/q/1825720/995714) , [Timer ad alta risoluzione con C++ e Linux?] (Http://stackoverflow.com/q/538609/995714) –

risposta

12

tuo clock_t è apparentemente un tipo a 64 bit senza segno.

Stai prendendo tick - tock, dove tock è stata misurata dopotick, quindi se c'è qualche differenza tra i due a tutti, sta andando a cercare di produrre un numero negativo - ma dal momento che è un tipo senza segno, questo è il confezionamento intorno a diventare qualcosa vicino al numero più grande che può essere rappresentato in quel tipo.

Ovviamente, si vuole davvero usare tock-tick invece.

+2

Dio, sono un idiota: / – Phill

-2

diciamo che tic = 2ms e tac è 4ms; quindi quando fai tic-tac (2-4) che genererà un numero negativo ovviamente .. anche se ha un numero positivo non sarà il tempo reale. e inoltre, il numero che genera (che non appare sul mio computer) è un numero grande, quindi, prova ad usare il manipolatore;

#include"iomanip" 
    cout << fixed << showpoint; 
cout << setprecision(2); 

potrebbe funzionare ..