Como outros já observaram, a função time () na biblioteca padrão C não possui uma resolução melhor que um segundo. A única função C totalmente portátil que pode fornecer uma melhor resolução parece ser clock (), mas que mede o tempo do processador em vez do tempo do relógio de parede. Se alguém se contentar em se limitar às plataformas POSIX (por exemplo, Linux), a função clock_gettime () é uma boa opção.
Desde o C ++ 11, existem recursos de tempo muito melhores disponíveis que oferecem melhor resolução, de uma forma que deve ser muito portátil em diferentes compiladores e sistemas operacionais. Da mesma forma, a biblioteca boost :: datetime fornece boas classes de tempo de alta resolução que devem ser altamente portáteis.
Um desafio ao usar qualquer um desses recursos é o atraso introduzido consultando o relógio do sistema. Ao experimentar clock_gettime (), boost :: datetime e std :: chrono, esse atraso pode ser facilmente uma questão de microssegundos. Portanto, ao medir a duração de qualquer parte do seu código, é necessário permitir que exista um erro de medição desse tamanho ou tente corrigir o erro zero de alguma forma. Idealmente, convém reunir várias medidas do tempo gasto por sua função e calcular o tempo médio ou máximo / mínimo gasto em várias execuções.
Para ajudar com todos esses problemas de portabilidade e coleta de estatísticas, desenvolvo a biblioteca cxx-rtimers disponível no Github, que tenta fornecer uma API simples para sincronizar blocos de código C ++, calcular erros zero e reportar estatísticas de vários timers incorporados no seu código. Se você possui um compilador C ++ 11, basta #include <rtimers/cxx11.hpp>
usar algo como:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Na saída do programa, você obterá um resumo das estatísticas de tempo gravadas em std :: cerr, como:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
que mostra o tempo médio, seu desvio padrão, os limites superior e inferior e o número de vezes que essa função foi chamada.
Se você quiser usar funções de tempo específicas do Linux, poderá #include <rtimers/posix.hpp>
, ou se tiver as bibliotecas Boost, mas um compilador C ++ mais antigo, poderá #include <rtimers/boost.hpp>
. Existem também versões dessas classes de timer que podem coletar informações de tempo estatístico de vários threads. Também existem métodos que permitem estimar o erro zero associado a duas consultas imediatamente consecutivas do relógio do sistema.
time()
retorna um valor diferente.