Jak już zauważyli inni, funkcja time () w standardowej bibliotece C nie ma rozdzielczości lepszej niż jedna sekunda. Jedyną w pełni przenośną funkcją C, która może zapewnić lepszą rozdzielczość, wydaje się być clock (), ale raczej mierzy czas procesora niż czas zegara ściennego. Jeśli ktoś chce ograniczyć się do platform POSIX (np. Linux), to funkcja clock_gettime () jest dobrym wyborem.
Od wersji C ++ 11 istnieją znacznie lepsze możliwości pomiaru czasu które oferują lepszą rozdzielczość w formie, która powinna być bardzo przenośna w różnych kompilatorach i systemach operacyjnych. Podobnie biblioteka boost :: datetime zapewnia dobre klasy czasowe wysokiej rozdzielczości, które powinny być wysoce przenośne.
Jednym z wyzwań przy korzystaniu z któregokolwiek z tych urządzeń jest opóźnienie czasowe wprowadzone przez zapytanie zegara systemowego. Od eksperymentowania z clock_gettime (), boost :: datetime i std :: chrono, to opóźnienie może być łatwo kwestią mikrosekund. Tak więc, mierząc czas trwania dowolnej części kodu, musisz pozwolić, aby wystąpił błąd pomiaru mniej więcej tego rozmiaru, lub spróbuj w jakiś sposób poprawić ten błąd zerowy. Najlepiej byłoby zebrać wiele pomiarów czasu zajętych przez funkcję i obliczyć średni lub maksymalny / minimalny czas potrzebny na wiele przebiegów.
Aby pomóc w rozwiązaniu wszystkich problemów związanych z przenośnością i gromadzeniem statystyk, opracowałem bibliotekę cxx-rtimers dostępną na Github, która stara się zapewnić prosty interfejs API dla bloków czasowych kodu C ++, obliczania zerowych błędów i raportowania statystyk z wielu osadzonych timerów w twoim kodzie. Jeśli masz kompilator C ++ 11, po prostu #include <rtimers/cxx11.hpp>
i użyj czegoś takiego:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Po wyjściu z programu otrzymasz podsumowanie statystyk czasowych zapisanych do std :: cerr, takich jak:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
który pokazuje średni czas, jego odchylenie standardowe, górną i dolną granicę oraz liczbę wywołań tej funkcji.
Jeśli chcesz korzystać z funkcji czasowych specyficznych dla Linuksa, możesz #include <rtimers/posix.hpp>
, lub jeśli masz biblioteki Boost, ale starszy kompilator C ++, możesz #include <rtimers/boost.hpp>
. Istnieją również wersje tych klas timerów, które mogą gromadzić statystyczne informacje o taktowaniu z wielu wątków. Istnieją również metody, które pozwalają oszacować błąd zerowy związany z dwoma bezpośrednio kolejnymi zapytaniami zegara systemowego.
time()
zwraca inną wartość.