我有以下代码:
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吸尽了它应该测量的微秒,但它测量的是微秒,误差为十分之一微秒???
最佳答案
Posix时间:microsec_clock:
使用亚秒级分辨率时钟获取UTC时间。在Unix系统上,这是使用GetTimeOfDay实现的。在大多数Win32平台上,它是使用ftime实现的。 Win32系统通常无法通过此API达到微秒级的分辨率。如果更高的分辨率对您的应用程序至关重要,请测试平台以查看达到的分辨率。ftime
根本不提供微秒分辨率。该自变量可以包含单词microsecond
,但实现不提供该范围内的任何准确性。它的粒度在ms制中。
当您的操作需要更多时间(例如至少20ms)时,您会得到与零不同的东西。
编辑:注意:从长远来看,Windows的microsec_clock
实现应尽可能使用GetSystemTimePreciseAsFileTime function(最小要求Windows 8桌面,Windows Server 2012桌面)来实现微秒分辨率。
关于c++ - 使用boost::posix_time::microsec_clock进行的测量错误是否超过十微秒?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12972221/