3

私のmacbookproのブーストクロノライブラリvs1.51は、endTime --startTimeを差し引くと、負の時間を返します。時点を印刷すると、終了時刻が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ナノ秒反復あたりの平均解析時間:0ミリ秒

4

1 に答える 1

5

ハイパースレッディングまたは単に干渉をスケジュールするだけで、Boost 実装は OS への単調なサポートをパントします。

POSIX:clock_gettime (CLOCK_MONOTONIC)ただし、システムの調整時にハイパースレッディングを処理するカーネル エラーが原因で失敗する場合があります。

WIN32: QueryPerformanceCounter()Nehalem アーキテクチャ以降以外では、コアとスレッド間で単調になることはありません。

OSX: mach_absolute_time()、つまり、安定したクロックと高解像度のクロックは同じです。ソースコードは、RDTSCハードウェアの安定性に厳密に依存していることを示しています。つまり、保証はありません。

ハイパースレッディングを無効にすることをお勧めしますが、Windows では本当に制限があると言えます。タイマーの解像度を下げる以外に、スレッド アフィニティを確保しながら、基盤となるハードウェア タイマーに直接アクセスする方法しかありません。

Boost にバグを送信する良い機会だと思われます。

Win32:こちらでGetTick64Count()説明されているように を使用します。

OSX:この質問clock_get_time (SYSTEM_CLOCK)に従って使用します。

于 2012-11-20T17:44:45.230 に答える