измерять разницу во времени - PullRequest
2 голосов
/ 15 декабря 2010

Я хочу измерить в миллисекундах, сколько времени проходит между моментом, когда я запускаю свое приложение, и другим временем, например, 16:00.Каков наилучший способ сделать это?

Я просмотрел функцию «часы», но это не то, что мне нужно.

Операционная система: Win NT и выше

Ответы [ 2 ]

9 голосов
/ 15 декабря 2010

Поиск gettimeofday для систем POSIX и timeGetTime для Windows.

Редактирование: кажется, что ОП запрашивал код для сравнения текущего времени / даты с другимдаты / времени.Следующий фрагмент демонстрирует, как получить текущую дату и время в Windows:

 #include <Windows.h>
 #include <stdio.h>

 void main()
 {
     SYSTEMTIME st;
     GetSystemTime(&st);
     printf("Year:%d\nMonth:%d\nDate:%d\nHour:%d\nMin:%d\nSecond:%d\n"
       ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
 }

А вот как вычислить разницу между двумя объектами SYSTEMTIME:

 #include <windows.h>
 #include <iostream>

 // Return time difference in units of 100 us.
 _int64 Delta(const SYSTEMTIME st1, const SYSTEMTIME st2) {
  union timeunion {
      FILETIME fileTime;
      ULARGE_INTEGER ul;
  } ;

  timeunion ft1;
  timeunion ft2;

  SystemTimeToFileTime(&st1, &ft1.fileTime);
  SystemTimeToFileTime(&st2, &ft2.fileTime);

  return ft2.ul.QuadPart - ft1.ul.QuadPart;
}

int main() {
  SYSTEMTIME t1 = {0}, t2 = {0};
  t1.wDay = 10;
  t1.wMonth = 4;
  t1.wYear = 2009;

  t2.wDay = 12;
  t2.wMonth = 4;
  t2.wYear = 2009;

  _int64 i = Delta(t1, t2);
  std::cout << "times are " << i / 10000000 << " seconds apart\n";

  return 0;
}

Эти два примера должны дать вам инструменты для того, что вам нужно.

4 голосов
/ 15 декабря 2010

Если вы работаете в системе POSIX, вы можете использовать gettimeofday(3):

struct timeval start, end;
gettimeofday(&start, NULL);
...
gettimeofday(&end, NULL);

// Watch out for overflow!
int delta_milliseconds = 1000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)/1000;

Если вы используете Windows, вы можете использовать GetTickCount:

DWORD start, end;
start = GetTickCount();
...
end = GetTickCount();
int delta_milliseconds = end - start;

Но помните, что GetTickCount имеет разрешение всего около 10-16 мс.Если вам нужна большая точность, используйте QueryPerformanceCounter и QueryPerformanceFrequency вместо:

// Error-checking omitted for expository purposes
LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
...
QueryPerformanceCounter(&end);
double delta_milliseconds = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart * 1000.0;
...