boost chrono endTime - startTime在boost 1.51中返回负数

时间:2012-11-20 16:52:45

标签: c++ boost chrono

当我减去endTime - startTime时,我的macbook pro上的boost chrono library vs1.51返回负数。如果打印时间点,则会看到结束时间早于startTime。怎么会发生这种情况?

typedef boost::chrono::steady_clock clock_t;
clock_t clock;

// Start time measurement
boost::chrono::time_point<clock_t>  startTime = clock.now();
short test_times = 7;

// Spend some time...
for ( int i=0; i<test_times; ++i )
{
   xnodeptr spResultDoc=parser.parse(inputSrc);

  xstring sXmlResult = spResultDoc->str();
  const char16_t* szDbg = sXmlResult.c_str();

  BOOST_CHECK(spResultDoc->getNodeType()==xnode::DOCUMENT_NODE && sXmlResult == sXml);
}

// Stop time measurement
boost::chrono::time_point<clock_t> endTime = clock.now();
clock_t::duration elapsed( endTime - startTime);

std::cout << std::endl;
std::cout << "Now time: " << clock.now() << std::endl;
std::cout << "Start time: " << startTime << std::endl;
std::cout << "End time: " << endTime << std::endl;

std::cout << std::endl << "Total Parse time: " << elapsed << std::endl;
std::cout << "Avarage Parse time per iteration: " <<  (boost::chrono::duration_cast<boost::chrono::milliseconds>(elapsed) / test_times) << std::endl;

我尝试了不同的时钟,但没有区别。

任何帮助将不胜感激!

编辑:忘记添加输出:

现在时间:启动后1纳秒

开始时间:自启动以来的140734799802912纳秒

结束时间:自启动以来的140734799802480纳秒

总解析时间: -432 纳秒 Avarage每次迭代的解析时间:0毫秒

1 个答案:

答案 0 :(得分:5)

超线程或仅调度干扰,Boost implementation对操作系统的单调支持:

POSIX:clock_gettime (CLOCK_MONOTONIC)虽然在校准系统时由于内核错误处理超线程而仍然可能失败。

WIN32:QueryPerformanceCounter()除了Nehalem架构或更新版本之外的任何内容都不会在内核和线程上单调。

OSX:mach_absolute_time(),即稳定&amp;高分辨率时钟是一样的。 source code表明它使用RDTSC因此严格依赖硬件稳定性:即无保证。

禁用超线程是一种推荐的方法,但在Windows上说你真的有限。除了丢弃定时器分辨率之外,唯一可用的方法是直接访问底层硬件定时器,同时确保线程亲和性。

这似乎是向Boost提交错误的好时机,我建议:

Win32:使用GetTick64Count(),如上所述here

OSX:根据clock_get_time (SYSTEM_CLOCK)使用this question