使用boost :: posix_time :: microsec_clock进行测量的误差超过10微秒?

时间:2012-10-19 10:20:57

标签: c++ winapi boost time

我有以下代码:

long long unsigned int GetCurrentTimestamp()
{
   LARGE_INTEGER res;
   QueryPerformanceCounter(&res);
   return res.QuadPart;
}


long long unsigned int initalizeFrequency()
{
   LARGE_INTEGER res;
   QueryPerformanceFrequency(&res);
   return res.QuadPart;
}


//start time stamp
boost::posix_time::ptime startTime = boost::posix_time::microsec_clock::local_time();
long long unsigned int start = GetCurrentTimestamp();


// ....
// execution that should be measured
// ....

long long unsigned int end = GetCurrentTimestamp();
boost::posix_time::ptime endTime = boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration duration = endTime - startTime;
std::cout << "Duration by Boost posix: " << duration.total_microseconds() <<std::endl;
std::cout << "Processing time is " << ((end - start) * 1000000 / initalizeFrequency()) 
            << " microsec "<< std::endl;

此代码的结果是

Duration by Boost posix: 0
Processing time is 24 microsec

为什么会出现如此大的分歧? Boost糟透了它应该测量微秒,但它测量微秒,十分之一微秒误差???

2 个答案:

答案 0 :(得分:4)

Posix时间:microsec_clock:

使用亚秒分辨率时钟获取UTC时间。在Unix系统上,这是使用GetTimeOfDay实现的。在大多数Win32平台上,它是使用ftime实现的。 Win32系统通常不能通过此API实现微秒级分辨率。如果更高的分辨率对您的应用程序至关重要,请测试您的平台以查看已达到的分辨率。

ftime根本不提供微秒级分辨率。参数可能包含单词microsecond,但实现不提供该范围内的任何准确性。它的粒度是在ms制度中。

当你的手术需要更多时间,比如说超过20毫秒时,你会得到与ZERO不同的东西。

修改:注意:从长远来看,Windows microsec_clock实施应尽可能使用GetSystemTimePreciseAsFileTime function(最低要求.Windows) 8台桌面,Windows Server 2012桌面)实现微秒级分辨率。

答案 1 :(得分:2)

不幸的是,boost::posix_time::microsec_clock的当前Boost实施不使用QueryPerformanceCounter Win32 API,而是使用GetSystemTimeAsFileTime而不是GetSystemTime。但系统时间分辨率是毫秒(甚至更差)。