No Windows, clock()
retorna o tempo em milissegundos, mas nesta máquina Linux em que estou trabalhando, ele o arredonda para o 1000 mais próximo, de modo que a precisão é apenas para o "segundo" nível e não para o nível de milissegundos.
Eu encontrei uma solução com o Qt usando a QTime
classe, instanciando um objeto e chamando start()
em seguida, chamando elapsed()
para obter o número de milissegundos decorridos.
Tive sorte porque estou trabalhando com Qt para começar, mas gostaria de uma solução que não dependa de bibliotecas de terceiros,
Não existe uma maneira padrão de fazer isso?
ATUALIZAR
Por favor, não recomende Boost ..
Se Boost e Qt podem fazer isso, certamente não é mágica, deve haver algo padrão que eles estão usando!
Respostas:
Você pode usar gettimeofday no início e no final do seu método e, em seguida, diferenciar as duas estruturas de retorno. Você obterá uma estrutura como a seguinte:
EDITAR: Como os dois comentários abaixo sugerem, clock_gettime (CLOCK_MONOTONIC) é uma escolha muito melhor se você o tiver disponível, que deve estar em quase todos os lugares atualmente.
EDIT: Alguém comentou que você também pode usar C ++ moderno com std :: chrono :: high_resolution_clock, mas isso não é garantido como monotônico. Em vez disso, use stable_clock.
fonte
CLOCK_MONOTONIC
é ótimo para evitar ajustes de hora do sistema localizados.fonte
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
@CTT, você poderia atualizar o exemplo alterandostruct timeval
parastruct timespec
egettimeofday(&start, NULL)
paraclock_gettime(CLOCK_MONOTONIC, &start)
para que as pessoas não tenham problemas?Por favor note que
clock
se não medir o tempo de relógio de parede. Isso significa que se o seu programa leva 5 segundos,clock
não medirá 5 segundos necessariamente, mas poderá mais (seu programa pode executar vários threads e, portanto, pode consumir mais CPU do que o tempo real) ou menos. Ele mede uma aproximação do tempo de CPU usado. Para ver a diferença, considere este códigoProduz no meu sistema
Porque tudo o que fizemos foi dormir e não usar o tempo da CPU! No entanto, usando
gettimeofday
obtemos o que queremos (?)Saídas em meu sistema
Se você precisa de mais precisão, mas deseja obter o tempo da CPU , pode considerar o uso da
getrusage
função.fonte
sleep()
- Já pensei em fazer uma pergunta (por que funciona bem para todos, exceto para mim ?!) , quando encontrei sua resposta.Também recomendo as ferramentas oferecidas pelo Boost. Ou o Boost Timer mencionado, ou hackear algo fora do Boost.DateTime ou há uma nova biblioteca proposta na sandbox - Boost.Chrono : Este último será um substituto para o Timer e terá:
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
, com typedefs:system_timer
monotonic_timer
high_resolution_timer
process_clock
, capturando tempos reais, da CPU do usuário e da CPU do sistema.process_timer
, capturando tempos reais decorridos, da CPU do usuário e da CPU do sistema.run_timer
, relatórios convenientes de | process_timer | resultados.Aqui está a fonte da lista de recursos
fonte
Escrevi uma
Timer
aula com base na resposta dos CTT . Pode ser usado da seguinte maneira:Aqui está sua implementação:
fonte
Se você não precisa que o código seja portátil para unidades antigas, você pode usar clock_gettime (), que fornecerá o tempo em nanossegundos (se o seu processador suportar essa resolução). É POSIX, mas de 2001.
fonte
clock () geralmente tem uma resolução muito ruim. Se você quiser medir o tempo no nível dos milissegundos, uma alternativa é usar clock_gettime (), conforme explicado nesta pergunta.
(Lembre-se de que você precisa fazer um link com -lrt no Linux).
fonte
Com C ++ 11 e
std::chrono::high_resolution_clock
você pode fazer isso:Resultado:
Link para a demonstração: http://cpp.sh/2zdtu
fonte
clock () não retorna milissegundos ou segundos no linux. Normalmente, clock () retorna microssegundos em um sistema Linux. A maneira correta de interpretar o valor retornado por clock () é dividi-lo por CLOCKS_PER_SEC para descobrir quanto tempo se passou.
fonte
Isso deve funcionar ... testado em um mac ...
Sim ... execute duas vezes e subtraia ...
fonte
No padrão POSIX
clock
, seu valor de retorno é definido em termos do símbolo CLOCKS_PER_SEC e uma implementação é livre para definir isso de qualquer maneira conveniente. No Linux, tive sorte com atimes()
função.fonte
gettimeofday - o problema é que pode ter valores menores se você alterar o clock do hardware (com NTP por exemplo) Boost - não disponível para este projeto clock () - normalmente retorna um inteiro de 4 bytes, o que significa que é uma baixa capacidade, e depois de algum tempo, ele retorna números negativos.
Prefiro criar minha própria aula e atualizar a cada 10 milissegundos, então dessa forma é mais flexível, podendo até melhorar para ter inscritos.
para atualizá-lo, eu uso setitimer:
Veja setitimer e ITIMER_VIRTUAL e ITIMER_REAL.
Não use as funções de alarme ou ualarm, você terá baixa precisão quando seu processo for difícil.
fonte
Eu prefiro a biblioteca Boost Timer por sua simplicidade, mas se você não quiser usar bibliotecas de terceiros, usar clock () parece razoável.
fonte
Como uma atualização, parece que no Windows Clock () mede o tempo do relógio de parede (com precisão CLOCKS_PER_SEC)
enquanto no Linux ele mede o tempo de CPU nos núcleos usados pelo processo atual
e (parece, e conforme observado pelo autor original), na verdade, com menos precisão do que CLOCKS_PER_SEC, embora talvez isso dependa da versão específica do Linux.
fonte
Eu gosto do método Hola Soy de não usar gettimeofday (). Aconteceu comigo em um servidor em execução, o administrador mudou o fuso horário. O relógio foi atualizado para mostrar o mesmo valor local (correto). Isso fez com que as funções time () e gettimeofday () mudassem 2 horas e todos os carimbos de data / hora em alguns serviços travassem.
fonte
Eu escrevi uma
C++
aula usandotimeb
.Funções de membro:
Exemplo de uso:
A saída do meu computador é '19'. A precisão da
msTimer
classe é da ordem de milissegundos. No exemplo de uso acima, o tempo total de execução usado pelofor
-loop é rastreado. Desta vez, incluiu a alternância do sistema operacional dentro e fora do contexto de execuçãomain()
devido à multitarefa.fonte