Я использую функцию QueryPerformanceCounter() для измерения времени в моем приложении. Эта функция также используется для того, чтобы предоставить временную линию моего срока службы. Недавно я заметил, что существует дрейф времени относительно других временных функций. Наконец, я написал небольшой тест, чтобы проверить, является ли дрейф реальным или нет. (Я использую VS2013 компилятор)Окно временного дрейфа performancecounter C++
#include <Windows.h>
#include <chrono>
#include <thread>
#include <cstdio>
static LARGE_INTEGER s_freq;
using namespace std::chrono;
inline double now_WinPerfCounter()
{
LARGE_INTEGER tt;
if (TRUE != ::QueryPerformanceCounter(&tt))
{
printf("Error in QueryPerformanceCounter() - Err=%d\n", GetLastError());
return -1.;
}
return (double)tt.QuadPart/s_freq.QuadPart;
}
inline double now_WinTick64()
{
return (double)GetTickCount64()/1000.;
}
inline double now_WinFileTime()
{
FILETIME ft;
::GetSystemTimeAsFileTime(&ft);
long long * pVal = reinterpret_cast<long long *>(&ft);
return (double)(*pVal)/10000000. - 11644473600LL;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (TRUE != ::QueryPerformanceFrequency(&s_freq))
{
printf("Error in QueryPerformanceFrequency() - Err=#d\n", GetLastError());
return -1;
}
// save all timetags at the beginning
double t1_0 = now_WinPerfCounter();
double t2_0 = now_WinTick64();
double t3_0 = now_WinFileTime();
steady_clock::time_point t4_0 = steady_clock::now();
for (int i = 0;; ++i) // forever
{
double t1 = now_WinPerfCounter();
double t2 = now_WinTick64();
double t3 = now_WinFileTime();
steady_clock::time_point t4 = steady_clock::now();
printf("%03d\t %.3lf %.3lf %.3lf %.3lf \n",
i,
t1 - t1_0,
t2 - t2_0,
t3 - t3_0,
duration_cast<nanoseconds>(t4 - t4_0).count() * 1.e-9
);
std::this_thread::sleep_for(std::chrono::seconds(10));
}
return 0;
}
Выход был, запутанным:
000 0.000 0.000 0.000 0.000
...
001 10.001 10.000 10.002 10.002
...
015 150.006 150.010 150.010 150.010
...
024 240.009 240.007 240.015 240.015
...
025 250.010 250.007 250.015 250.015
...
026 260.010 260.007 260.016 260.016
...
070 700.027 700.039 700.041 700.041
Почему есть разница? Похоже, что одна секунда не одинакова при использовании разных функций API? Кроме того, в течение дня разница не постоянна ...
Ниже я приведу дополнительную информацию. Однако не могли бы вы рассказать о стоимости вашей частотной частоты ** (s_freq.QuadPart) **. Это число позволило бы дать более глубокое понимание, поскольку оно раскрывает информацию о вашей платформе. – Arno
Привет @Arno, s_freq.QuadPart равна 3507568 –
3,6 ГГц платформа? – Arno