Come usare clock () in C ++


127

Come chiamare clock()in C++?

Ad esempio, voglio testare quanto tempo impiega una ricerca lineare per trovare un determinato elemento in un array.


1
Si noti che l'ora dell'orologio da parete non è sempre un buon modo per cronometrare i microbenchmark. Per ottenere risultati coerenti, è necessario aggirare il ridimensionamento della frequenza della CPU (incluso Intel turbo o l'equivalente AMD, che consente di aumentare il clock della CPU quando i limiti termici / di potenza lo consentono). La creazione di profili con contatori delle prestazioni può fornire misurazioni nei cicli di core clock (e anche dettagli sul fatto che un collo di bottiglia sia la mancanza di cache rispetto al rendimento delle istruzioni rispetto alla latenza, osservando contatori diversi dai soli cicli). Su Linux,perf stat -d ./a.out
Peter Cordes,

Risposte:


207
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Your algorithm here */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}

5
Da quello che posso vedere qui cplusplus.com/reference/ctime/clock , non è necessario utilizzare la notazione "std ::". Usa "clock ()"
gromit190 il

4
@Birger: In tutto il progetto ho lavorato, ma lo stile del codice richiede std :: prima di ogni chiamata std ::.
Th. Thielemann,

2
Questo restituisce la risposta in pochi secondi?
Arnav Borborah,

1
@ArnavBorborah Sì, lo fa.
QuantumHoneybees

1
@ Th.Thielemann entrambi clock()e clock_tprovengono dall'intestazione della libreria standard C di time.h, e quindi non hanno bisogno dell'uso dei stdprefissi dello spazio dei nomi dopo l'inclusione delle loro librerie. <ctime>esegue il wrapping di tale valore e funzione con lo stdspazio dei nomi, ma non è necessario utilizzarlo. Controlla qui per i dettagli di implementazione: en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

Una soluzione alternativa, portatile e con maggiore precisione, disponibile dal C ++ 11, è l'utilizzo std::chrono.

Ecco un esempio:

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

Eseguire questo su ideone.com mi ha dato:

Delta t2-t1: 282 nanoseconds

11
Se stai suggerendo di usare C ++ 11, puoi anche scrivere using Clock=std::chrono::high_resolution_clock;. Vedi alias di tipo .
JHBonarius,

std::chrono::high_resolution_clocknon è monotonico in tutte le implementazioni di lib standard. Dal cppreference - Generalmente si dovrebbe semplicemente usare std :: chrono :: steady_clock o std :: chrono :: system_clock direttamente invece di std :: chrono :: high_resolution_clock: usare steady_clock per le misurazioni della durata e system_clock per l'ora dell'orologio da parete.
Kristianmitk,

30

clock()restituisce il numero di tick dell'orologio dall'inizio del programma. Esiste una costante correlata CLOCKS_PER_SEC, che indica quanti tick di clock si verificano in un secondo. Pertanto, è possibile testare qualsiasi operazione come questa:

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;

6
timeInSecondsviene sempre 0.000000per me. Come lo riparerei?
noufal,

3
@noufal Forse il tempo trascorso è così breve che appare come 0. Potresti provare a usare a long doubleper ottenere più precisione.
Gerard,

probabilmente la risoluzione del tuo orologio non è abbastanza alta, quindi non è trascorso molto tempo.
Marco Freudenberger,

4

Almeno su Windows, l' unico meccanismo di misurazione praticamente accurato è QueryPerformanceCounter (QPC). std :: crono è implementato usando (dal VS2015, se si utilizza questo), ma è non è preciso nella stessa misura come l'utilizzo direttamente QueryPerformanceCounter. In particolare si afferma che la granularità a 1 nanosecondo non è assolutamente corretta. Quindi, se stai misurando qualcosa che richiede un tempo molto breve (e il tuo caso potrebbe essere solo un caso del genere), allora dovresti usare QPC o l'equivalente per il tuo sistema operativo. Mi sono imbattuto in questo durante la misurazione delle latenze della cache e ho annotato alcune note che potresti trovare utili, qui; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md


0
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep()  --- just a function that waits a certain amount of milliseconds

using namespace std;

int main()
{

    clock_t cl;     //initializing a clock type

    cl = clock();   //starting time of clock

    _sleep(5167);   //insert code here

    cl = clock() - cl;  //end point of clock

    _sleep(1000);   //testing to see if it actually stops at the end point

    cout << cl/(double)CLOCKS_PER_SEC << endl;  //prints the determined ticks per second (seconds passed)


    return 0;
}

//outputs "5.17"

Questo non si aggiunge alla domanda già risposta. Sleep dopo cl = clock () - cl non è necessario. E la cout stampa secondi non tick al secondo. cl memorizza i segni di spunta dell'orologio.
Dr Yunke,

0

Probabilmente potresti essere interessato a un timer come questo: H: M: S. Msec.

il codice nel sistema operativo Linux:

#include <iostream>
#include <unistd.h>

using namespace std;
void newline(); 

int main() {

int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;


//cout << "Press any key to start:";
//char start = _gtech();

for (;;)
{
        newline();
                if(msec == 1000)
                {
                        ++sec;
                        msec = 0;
                }
                if(sec == 60)
                {
                        ++min;
                        sec = 0; 
                }
                if(min == 60)
                {
                        ++hr;
                        min = 0;
                }
        cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
        ++msec;
        usleep(100000); 

}

    return 0;
}

void newline()
{
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}

Potresti voler controllare la prima condizione ... 10 msec = 1 sec?
Dr Yunke,

2
Questo accumulerà un errore relativo nel tempo perché non includi il tempo necessario per la stampa e usleepnon tornerà sempre dopo esattamente l'importo richiesto. A volte sarà più lungo. Dovresti controllare l'ora corrente all'inizio, quindi controllare l'ora corrente e sottrarre per ottenere l'ora assoluta da quando hai iniziato ogni volta attraverso il ciclo.
Peter Cordes,

0

puoi misurare la durata del tuo programma. Le seguenti funzioni aiutano a misurare il tempo della CPU dall'inizio del programma:

  • C ++ (double) clock () / CLOCKS AL SEC con ctime incluso.
  • python time.clock () restituisce il valore in virgola mobile in secondi.
  • Java System.nanoTime () restituisce un valore lungo in nanosecondi.

il mio riferimento : Algorithms toolbox settimana 1 corso parte della specializzazione in strutture di dati e algoritmi della University of California San Diego e della National Research University Higher School of Economics

così puoi aggiungere questa riga di codice dopo il tuo algoritmo

cout << (double)clock() / CLOCKS_PER_SEC ;

Uscita prevista: l'uscita che rappresenta il numero di clock ticks per second


1
La domanda è chiedere solo per c ++. Quindi è bello fare riferimento ad altri linguaggi / script di programmazione, ma è fuori tema.
Dboy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.