Liczenie różnicy czasów

0

Witam.
Mam prosty program:

#include <cstdio>
#include <ctime>
#include <boost/timer.hpp>

int main(int argc, char **argv)
{
  double dif1, dif2, dif3;
  time_t  start1, end1;
  clock_t start2, end2;
  boost::timer timeCnt;

  time(&start1);
  start2 = clock();
  timeCnt.restart();
  for(int i(0); i < 500000; i++)
    {
      printf("%d\n", i);
    }
  time(&end1);
  end2 = clock();
  dif1 = difftime(end1, start1);
  dif2 = static_cast<double>(end2 - start2) / CLOCKS_PER_SEC;
  dif3 = timeCnt.elapsed();


  printf("Time 1 : %.2lf\n", dif1);
  printf("Time 2 : %.2lf\n", dif2);
  printf("Time 3 : %.2lf\n", dif3);
  return 1;
}

W wyniku otrzymuję:

Time 1 : 9.00
Time 2 : 1.64
Time 3 : 1.64

Który z tych czasów jest prawidłowy? Skąd te różnice ?

0

time_t przechowuje czas w sekundach, a clock_t ilość taktów zegara (o rzędy wielkości mniejsze niż sekundy). Stąd różnica.

0

W dokumentacji boost'a jest taki wpis:

double elapsed() const // return elapsed time in seconds

Z tego by wynikało, że powinien zwrócić czas w sekundach.

0

No i zwrócił. Może źle się wyraziłem: chodzi o dokładność przechowywanej wartości. time_t przechowuje czas w sekundach z dokładnością do pełnej sekundy. Używając clock() (i dzieląc wynik przez odpowiednią stałą) i boostowego timer również otrzymujesz czas w sekundach, ale z większą dokładnością, jako ułamek.

0

To chyba zbyt duża różnica między tymi czasami (jakieś 7 sek. różnicy) ?

0

Szczerze mówiąc nie mogę za bardzo wpaść na jakikolwiek racjonalny powód, u mnie działa to w porządku, czasy są takie same (zaokrąglając ten ułamkowy).

0

A jakiego kompilatora używasz jeśli można wiedzieć ?

0

Może printf jest wielowątkowy :P a ty masz wielordzeniowy procesor? Zmierz program z użyciem samodzielnego timera i porównaj wyniki.

0

A ile Ci się w rzeczywistości wykonuje ten program? Możliwe jest, że i boost, i ilość cykli pokazują sam czas poświęcony na wykonanie programu, gdy był on aktywny, a time uwzględnia też czas wyplucia tych liczb na konsolę. Spróbuj przekierować wyjście do pliku tekstowego, wtedy możesz zobaczyć, czy coś się zmieniło.

0

To powinno rozjaśnić sprawę:

Time 1 : 7.00
Time 2 : 1.61
Time 3 : 1.61

real	0m7.279s
user	0m0.336s
sys	0m1.288s

Time 1 to czas od uruchomienia do zakończenia programu, a reszta pokazuje ile czasu program pracował.

0

clock Returns the number of clock ticks elapsed since the program was launched.

time Get the current calendar time as a time_t object.
time_t It is almost universally expected to be an integral value representing the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC.

boost::timer Class timer measures elapsed time. (wyżej w dokumentacji jest z resztą napisane, że ta klasa korzysta tylko z biblioteki standardowej C++, czyli z clock)

Nigdzie nie ma mowy o czasie procesora przeznaczonym na obecny proces. Wszystkie te wyniki powinny być takie same (z uwzględnieniem dokładności wyniku).

Tutaj program na moim komputerze, skompilowany kolejno przez mingw i visual c++:
user image

0

Za to w glibc jest taki opis funkcji clock:

/* Return the time used by the program so far (user time + system time).  */

A na MSDN:

Calculates the processor time used by the calling process.

0

W takim razie zmieniła się implementacja tej funkcji w Visual C++. W wersji 6, faktycznie jest tak jak piszesz, w nowszych możemy przeczytać, że clock Calculates the wall-clock time used by the calling process.
http://msdn.microsoft.com/en-us/library/4e2ess30%28v=VS.100%29.aspx

edit: po przeszukaniu jakiejś grupy dyskusyjnej okazało się, że zmienili dokumentację, a nie implementację :P. Wygląda więc na to, że na Windows zawsze funkcja zwracała 'wall-time'.
Wniosek taki, że w takim razie lepiej z clock w ogóle nie korzystać.

0

A jeżeli chodzi o Boosta to lepiej używać nowszej wersji timerów

Version 1 napisał(a)

The interfaces are the same across all platforms, but the semantics differ according to platform. Wall-clock time is measured on Windows, while CPU time is measured on POSIX-like systems.

Version 2 napisał(a)

The interfaces and their semantics are the same across all platforms.

1 użytkowników online, w tym zalogowanych: 0, gości: 1