2017-04-07 2 views
1

Betrachten Sie den folgenden Code-Schnipsel:std :: Chrono :: System_Clock vs std :: Chrono :: high_resolution_clock Verhalten

#include <chrono> 
#include <cassert> 

int main() 
{ 
    auto result1 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now().time_since_epoch()); 
    auto result2 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()); 
    assert((result2.count() - result1.count()) < 10); 
} 

Ich erwarte, dass der Unterschied in Zählungen zwischen den beiden Werten sollte minimal sein (idealerweise weniger als eine Sekunde). Bei VS2015 liegt der Zählungsunterschied jedoch in der Größenordnung von Milliarden von Sekunden. Wie ist das möglich?

+1

Der Code, wie gezeigt, kompiliert nicht. –

+0

Sie müssen und Arun

+0

einschließen ** Ihr Code ist ungültig ** eine gültige Besetzung: 'std :: chrono :: duration_cast (Ihre Zeit)' –

Antwort

4

Der Grund ist es für Sie behauptet, weil high_resolution_clock zu erlaubt ist (und oft tut) eine andere Epoche als system_clock.

Es ist der De-facto-Standard (nicht spezifiziert, aber tragbar), dass die Epoche system_clock Zeit seit 1970-01-01 00:00:00 UTC misst, unter Vernachlässigung der Schaltsekunden.

Es gibt keinen De-facto-Standard für high_resolution_clock. Auf gcc high_resolution_clock ist ein typedef für system_clock, und so weiter GCC-Plattformen, werden Sie die perfekte Synchronisation feststellen. Auf VS und libC++ high_resolution_clock ist ein typedef für steady_clock.

Für mich ist die Epoche von steady_clock immer wenn der Computer hochgefahren wird.

Here is a video tutorial for <chrono>. Es deckt viele Probleme ab, einschließlich dieses, und ist etwa eine Stunde lang.

Verwandte Themen