Como usar clock () em C ++

127

Como ligo clock()paraC++ ?

Por exemplo, quero testar quanto tempo uma pesquisa linear leva para encontrar um determinado elemento em uma matriz.

dato datuashvili
fonte
1
Observe que a hora do relógio de parede nem sempre é uma boa maneira de marcar as marcas de micropontos. Para obter resultados consistentes, é necessário contornar o escalonamento da frequência da CPU (incluindo Intel turbo ou o equivalente da AMD, que permite que o clock da CPU seja mais alto quando os limites térmicos / de energia permitem). A criação de perfil com contadores de desempenho pode fornecer medições em ciclos de clock principais (e também detalhes sobre se um gargalo é falta de cache x taxa de transferência de instruções x latência, observando outros contadores que não sejam apenas ciclos). No Linux,perf stat -d ./a.out
Peter Cordes

Respostas:

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';
}
Dolph
fonte
5
Pelo que posso ver aqui cplusplus.com/reference/ctime/clock , você não precisa usar a notação "std ::". Basta usar "clock ()"
gromit190 28/01
4
@ Birger: Em todo o projeto em que trabalhei, o estilo do código requer std :: antes de cada chamada std ::.
Th. Thielemann
2
Isso retorna a resposta em segundos?
Arnav Borborah
1
@ArnavBorborah Sim, faz.
QuantumHoneybees
1
@ Th.Thielemann ambos clock()e clock_tsão do cabeçalho da C Standard Library time.he, portanto, não precisam do uso de stdprefixos de namespace após a inclusão de suas bibliotecas. <ctime>agrupa esse valor e função com o stdespaço para nome, mas não é necessário usá-lo. Confira aqui os detalhes de implementação: en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck
70

Uma solução alternativa, portátil e com maior precisão, disponível desde o C ++ 11, é usar std::chrono .

Aqui está um exemplo:

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

Executar isso no ideone.com me deu:

Delta t2-t1: 282 nanoseconds
Martin G
fonte
11
Se você está sugerindo o uso do C ++ 11, também pode escrever using Clock=std::chrono::high_resolution_clock;. Veja o alias do tipo .
JHBonarius # 21/17
std::chrono::high_resolution_clocknão é monotônico em todas as implementações std lib. Da cppreference - Geralmente, deve-se usar std :: chrono :: stable_clock ou std :: chrono :: system_clock diretamente em vez de std :: chrono :: high_resolution_clock: use constant_clock para medições de duração e system_clock para o relógio de parede.
Kristianmitk
30

clock()retorna o número de tiques do relógio desde o início do programa. Há uma constante relacionada CLOCKS_PER_SEC, que informa quantos ticks de relógio ocorrem em um segundo. Assim, você pode testar qualquer operação como esta:

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
Shirik
fonte
6
timeInSecondsestá sempre vindo 0.000000para mim. Como eu consertaria isso?
Noufal
3
@noufal Talvez o tempo gasto seja tão curto que apareça como 0. Você pode tentar usar a long doublepara obter mais precisão.
Gerard
provavelmente a resolução do seu relógio não é alta o suficiente, portanto não há tempo decorrido.
Marco Freudenberger
4

No Windows, pelo menos, o único mecanismo de medição praticamente preciso é o QueryPerformanceCounter (QPC). std :: crono é implementado utilizando-lo (desde VS2015, se você usar isso), mas é não precisas com a mesma intensidade como usar QueryPerformanceCounter diretamente. Em particular, é alegado que o relatório com granularidade de 1 nanossegundo não está absolutamente correto. Portanto, se você estiver medindo algo que leva um tempo muito curto (e seu caso pode ser apenas um caso assim), use QPC, ou o equivalente para o seu sistema operacional. Eu me deparei com isso ao medir as latências do cache e anotei algumas anotações que você pode achar úteis aqui; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md

SonarJetLens
fonte
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"
Garrett
fonte
Isso não adiciona à pergunta já respondida. Dormir depois de cl = clock () - cl não é necessário. E o cout imprime segundos, não tiquetaques por segundo. cl armazena os tiques do relógio.
Dr Yunke
0

Provavelmente você pode estar interessado em um cronômetro como este: H: M: S. Msec.

o código no sistema operacional 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";
}
Färid Alijani
fonte
Você pode querer verificar a primeira condição ... 10 ms = 1 segundo?
Dr Yunke
2
Isso acumulará um erro relativo no tempo, porque você não inclui o tempo necessário para imprimir e usleepnem sempre retornará após exatamente o valor solicitado. Às vezes será mais longo. Você deve verificar a hora atual no início, depois verificar a hora atual e subtrair para obter a hora absoluta desde que você iniciou todas as vezes no loop.
Peter Cordes
0

você pode medir quanto tempo seu programa funciona. As seguintes funções ajudam a medir o tempo da CPU desde o início do programa:

  • Relógio C ++ (duplo) () / RELÓGIOS POR SEG. Com ctime incluído.
  • python time.clock () retorna o valor do ponto flutuante em segundos.
  • Java System.nanoTime () retorna um valor longo em nanossegundos.

minha referência : caixa de ferramentas de algoritmos, semana 1, parte da especialização em estruturas e algoritmos de dados da Universidade da Califórnia em San Diego e da Escola Nacional de Economia da Universidade Nacional de Pesquisa

para que você possa adicionar essa linha de código após o seu algoritmo

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

Saída esperada: a saída que representa o número de clock ticks per second

Muhamed Youssry
fonte
1
A pergunta é apenas para c ++. Portanto, é bom que você faça referência a outras linguagens / scripts de programação, mas está fora de tópico.
dboy