Entre as funções de temporização, time
, clock
getrusage
, clock_gettime
, gettimeofday
e timespec_get
, eu quero entender claramente como eles são implementados e quais são os seus valores de retorno a fim de saber em que situação eu tenho que usá-los.
Primeiro, precisamos classificar as funções que retornam valores de relógio de parede e comparar as funções que retornam valores de processos ou threads . gettimeofday
retornos valor parede do relógio, clock_gettime
retorna valor relógio de parede ou de processo ou valores de fios dependendo do Clock
parâmetro transmitido ao mesmo. getrusage
e clock
retornar valores do processo.
Em seguida, a segunda pergunta diz respeito à implementação dessas funções e, como conseqüência, à sua precisão. Qual mecanismo de hardware ou software essas funções usam.
Parece que getrusage
usa apenas o tick do kernel (geralmente 1ms de comprimento) e, como conseqüência, não pode ser mais preciso que o ms. Está certo? Em seguida, a getimeofday
função parece usar o hardware subjacente mais preciso disponível. Como conseqüência, sua precisão é geralmente o microssegundo (não pode ser mais por causa da API) no hardware recente. E clock
a página de manual fala sobre "aproximação", o que isso significa? E clock_gettime
a API está em nanossegundos? Isso significa que ela pode ser tão precisa se o hardware subjacente permitir? E a monotonicidade?
Existem outras funções?
fonte
clock_gettime
, portanto, o uso degettimeofday()
ser um pouco mais versátil do queclock_gettime()
times()
(com s), que existe no POSIX desde a edição 1. Sobre o GNU / Linux: De acordo com a página do manual clock (3), oclock()
glibc 2.17 e versões anteriores foram implementadas por cima, mas para melhorias precisão, agora é implementado no topoclock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, o que também é especificado no POSIX, mas é opcional.time
egettimeofday
retornam, pelo menos hoje em dia, segundos desde a época (aka unix-timestamps). Isso é independente dos fusos horários / horário de verão. Bissextos segundos são outra história ...C11
timespec_get
Exemplo de uso em: https://stackoverflow.com/a/36095407/895245
A precisão máxima possível retornada é de nanossegundos, mas a precisão real é definida pela implementação e pode ser menor.
Ele retorna o tempo de espera, não o uso da CPU.
O glibc 2.21 o implementa abaixo
sysdeps/posix/timespec_get.c
e encaminha diretamente para:clock_gettime
eCLOCK_REALTIME
são POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html , eman clock_gettime
afirma que esta medida pode ter descontinuidades se você alterar alguma configuração de hora do sistema enquanto o programa é executado.C ++ 11 crono
Como estamos nisso, vamos abordá-los também: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C ++ stdlib está dentro da origem do GCC):
high_resolution_clock
é um apelido parasystem_clock
system_clock
encaminha para o primeiro dos seguintes itens disponíveis:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
encaminha para o primeiro dos seguintes itens disponíveis:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Perguntado em: Diferença entre std :: system_clock e std :: stable_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: Diferença entre CLOCK_REALTIME e CLOCK_MONOTONIC?fonte