2015-08-19 13 views
7

Mam jednej linii kodu w moim kodu serwera aplikacji, która pobiera mi wartość datownika korzystając steady_clock jak pokazano poniżej:chrono steady_clock nie daje prawidłowego wyniku?

uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count(); 

Teraz mamy dwa systemy machineA który jest uruchomiony Ubuntu 12 (gcc 4.6.3 compiler) i machineB który jest uruchomiony Ubuntu 14 (gcc 4.8.2 compiler).

Teraz możemy skompilować kod serwera aplikacji za pomocą make na innymUbuntu 12 VM (which has 4.7.3 compiler), a następnie skopiuj plik tar, który zostanie wygenerowany na komputerze A i uruchom nasz serwer aplikacji. Po starcie, powyższy wiersz kodu wypisuje wartość takiego w machineA:

1439944652967 

Teraz możemy również przygotować nasz kod serwera samej aplikacji za pomocą uczynić na innyUbuntu 14 VM (which has 4.8.2 compiler) i skopiuj plik tar, który pobiera wygenerowaną do machineB i uruchom nasz serwer aplikacji. Po starcie powyższy wiersz kodu wypisuje wartość podobną do tej w maszynie B:

10011360 

Widzisz różnicę w prawo? Jestem zdezorientowany, dlaczego to jest różnica, nie jestem w stanie tego zrozumieć? Cały kod i wszystko jest takie samo. Czy ktoś ma jakieś wyjaśnienia na ten temat i jak mogę to naprawić?

W razie potrzeby mogę spróbować dodać kod debugowania, aby zobaczyć, co jest nie tak, aby zrozumieć ten problem.

Odpowiedz

13

Obawiam się, że istnieje pewne niejasności co do tego, co jest std::steady_clock.

time_since_epoch podaje czas od początku zegara, niekoniecznie epoki Unix. steady_clock gwarantuje tylko monotonny wzrost. Oznacza to, że steady_clock będzie zawsze poruszał się do przodu i że nigdy się nie zmniejszy.

Nie ma gwarancji na temat steady_clock reprezentujących cokolwiek znaczącego. Może to być czas od rozpoczęcia wykonywania programu, czas włączenia komputera, czas od ostatniego wtorku lub prawie wszystko, o ile będzie kontynuowany.

Innymi słowy, steady_clock nie jest tak naprawdę użyteczne, aby powiedzieć w czasie rzeczywistym. Przydatny jest jedynie pomiar upływu czasu. Jego zastosowania mogą obejmować dowolną sytuację, w której masz punkt A i punkt B, i jesteś ciekawy co do czasu między nimi: analiza porównawcza, prognozy postępu, itp.

Jeśli szukasz dla prawdziwego świata czas, należy spojrzeć na std::system_clock, zegar reprezentujący czas systemu (tj. czas systemu operacyjnego). Świetnie nadaje się do opowiedzenia czasu, ale jest dość bezużyteczny do pomiaru różnic, ponieważ nie ma gwarancji, że będzie monotoniczny i prawie na pewno nie zostanie podany czas letni, użytkownicy dostosowują swoje zegary i inne wydarzenia, które mogą zmienić rzeczywisty czas na świecie.

+2

W bardziej ogólnych terminach: "czas" mówi, która jest godzina, "zegary" po prostu idź. –

+0

Dobra odpowiedź, ale czas letni nie wpłynie na "system_clock". Parametr 'system_clock' zwykle śledzi czas Unix, który jest liczbą sekund nieskrępowanych od 1970-01-01 w strefie czasowej UTC. –

+0

@HowardHinnant Nie można zagwarantować czasu unixowego UTC, i jestem prawie pewien, że może on postrzegać DST.Zgodnie z normą: "Obiekty klasy system_clock reprezentują czas zegara ściennego z całego systemu w czasie rzeczywistym zegara." (bezwstydnie podniósł z [tutaj] (http://stackoverflow.com/questions/13263277/difference-between-stdsystem-clock-and-stdsteady-clock), ponieważ nie mam dostępu do standardu w tej chwili). "Czas zegara ściennego" na pewno zmienia się w zależności od czasu letniego. – Corbin

Powiązane problemy