Dalla N3376:
20.11.7.1 [time.clock.system] / 1:
Gli oggetti di classe system_clockrappresentano 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_clockrappresentano orologi per i quali i valori di time_pointnon diminuiscono mai con l'avanzare del tempo fisico e per i quali i valori di time_pointavanzamento 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_clockrappresentano gli orologi con il periodo di tick più breve. high_resolution_clockpuò essere sinonimo di system_clocko 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_clocknon è 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 C1e C2denotano i tipi di orologio. t1e t2sono valori restituiti da C1::now()dove la chiamata di ritorno t1avviene prima della chiamata di ritorno t2ed entrambe queste chiamate si verificano prima C1::time_point::max(). [Nota: questo significa che C1non è stato eseguito il wrapping tra t1e t2. —End nota]
Espressione: C1::is_steady
Restituisce: const bool
Semantica operazionale: truese 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 QueryPerformanceCountersu 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.