Como ligo clock()
paraC++
?
Por exemplo, quero testar quanto tempo uma pesquisa linear leva para encontrar um determinado elemento em uma matriz.
Como ligo clock()
paraC++
?
Por exemplo, quero testar quanto tempo uma pesquisa linear leva para encontrar um determinado elemento em uma matriz.
Respostas:
#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';
}
clock()
e clock_t
são do cabeçalho da C Standard Library time.h
e, portanto, não precisam do uso de std
prefixos de namespace após a inclusão de suas bibliotecas. <ctime>
agrupa esse valor e função com o std
espaço para nome, mas não é necessário usá-lo. Confira aqui os detalhes de implementação: en.cppreference.com/w/cpp/header/ctime
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
using Clock=std::chrono::high_resolution_clock;
. Veja o alias do tipo .
std::chrono::high_resolution_clock
nã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.
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;
timeInSeconds
está sempre vindo 0.000000
para mim. Como eu consertaria isso?
long double
para obter mais precisão.
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
#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"
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";
}
usleep
nem 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.
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:
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
perf stat -d ./a.out