Dalla N3376:
20.11.7.1 [time.clock.system] / 1:
Gli oggetti di classe system_clock
rappresentano l'ora dell'orologio da parete dall'orologio in tempo reale a livello di sistema.
20.11.7.2 [time.clock.steady] / 1:
Gli oggetti di classe steady_clock
rappresentano orologi per i quali i valori di time_point
non diminuiscono mai con l'avanzare del tempo fisico e per i quali i valori di time_point
avanzamento ad una velocità costante rispetto al tempo reale. Cioè, l'orologio potrebbe non essere regolato.
20.11.7.3 [time.clock.hires] / 1:
Gli oggetti di classe high_resolution_clock
rappresentano gli orologi con il periodo di tick più breve. high_resolution_clock
può essere sinonimo di system_clock
o steady_clock
.
Ad esempio, l'orologio del sistema potrebbe essere influenzato da qualcosa come l'ora legale, a quel punto l'ora effettiva elencata in un momento futuro può effettivamente essere un'ora nel passato. (Ad esempio, negli Stati Uniti, in autunno il tempo torna indietro di un'ora, quindi la stessa ora viene vissuta "due volte") Tuttavia, steady_clock
non è consentito essere influenzato da tali cose.
Un altro modo di pensare a "steady" in questo caso è nei requisiti definiti nella tabella del 20.11.3 [time.clock.req] / 2:
Nella Tabella 59 C1
e C2
denotano i tipi di orologio. t1
e t2
sono valori restituiti da C1::now()
dove la chiamata di ritorno t1
avviene prima della chiamata di ritorno t2
ed entrambe queste chiamate si verificano prima C1::time_point::max()
. [Nota: questo significa che C1
non è stato eseguito il wrapping tra t1
e t2
. —End nota]
Espressione: C1::is_steady
Restituisce: const bool
Semantica operazionale: true
se t1 <= t2
è sempre vero e il tempo tra i tick dell'orologio è costante, altrimenti false
.
Questo è tutto ciò che lo standard ha sulle loro differenze.
Se vuoi fare benchmarking, la soluzione migliore sarà probabilmente std::high_resolution_clock
, perché è probabile che la tua piattaforma utilizzi un timer ad alta risoluzione (ad esempio QueryPerformanceCounter
su Windows) per questo orologio. Tuttavia, se stai effettuando il benchmarking, dovresti davvero prendere in considerazione l'utilizzo di timer specifici della piattaforma per il tuo benchmark, perché piattaforme diverse gestiscono questo in modo diverso. Ad esempio, alcune piattaforme potrebbero fornire alcuni mezzi per determinare il numero effettivo di tick di clock richiesti dal programma (indipendentemente da altri processi in esecuzione sulla stessa CPU). Meglio ancora, metti le mani su un vero profiler e usalo.