De N3376:
20.11.7.1 [time.clock.system] / 1:
Os objetos de classe system_clock
representam o tempo do relógio de parede a partir do relógio de tempo real de todo o sistema.
20.11.7.2 [time.clock.steady] / 1:
Objetos de classe steady_clock
representam relógios para os quais os valores de time_point
nunca diminuem à medida que o tempo físico avança e para os quais os valores time_point
avançam a uma taxa constante em relação ao tempo real. Ou seja, o relógio pode não ser ajustado.
20.11.7.3 [time.clock.hires] / 1:
Objetos de classe high_resolution_clock
representam relógios com o período de tick mais curto. high_resolution_clock
pode ser sinônimo de system_clock
ou steady_clock
.
Por exemplo, o relógio amplo do sistema pode ser afetado por algo como o horário de verão, ponto no qual a hora real listada em algum momento no futuro pode realmente ser uma hora no passado. (Por exemplo, nos EUA, no outono o tempo retrocede uma hora, então a mesma hora é experimentada "duas vezes") No entanto, steady_clock
não é permitido ser afetado por tais coisas.
Outra maneira de pensar sobre "estável" neste caso está nos requisitos definidos na tabela de 20.11.3 [time.clock.req] / 2:
Na Tabela 59 C1
e C2
denotam os tipos de relógio. t1
e t2
são valores retornados por C1::now()
onde o retorno da chamada t1
ocorre antes do retorno da chamada t2
e ambas as chamadas ocorrem antes C1::time_point::max()
. [Nota: isso significa C1
que não ocorreu entre t1
e t2
. —Enviar nota]
Expressão: C1::is_steady
Retorna: const bool
Semântica Operacional: true
se t1 <= t2
é sempre verdadeiro e o tempo entre os tiques do relógio é constante, caso contrário false
.
Isso é tudo que o padrão tem sobre suas diferenças.
Se você quiser fazer benchmarking, sua melhor aposta provavelmente será std::high_resolution_clock
, porque é provável que sua plataforma use um cronômetro de alta resolução (por exemplo, QueryPerformanceCounter
no Windows) para este relógio. No entanto, se estiver fazendo um benchmarking, você realmente deve considerar o uso de timers específicos da plataforma para seu benchmark, porque plataformas diferentes lidam com isso de maneira diferente. Por exemplo, algumas plataformas podem fornecer alguns meios de determinar o número real de tiques do relógio que o programa requer (independente de outros processos em execução na mesma CPU). Melhor ainda, coloque as mãos em um criador de perfis de verdade e use-o.