1. ホーム
  2. c++

[解決済み] C++でナノ秒単位の時間を提供するタイマ機能

2022-11-06 11:09:40

質問

あるAPIが値を返すのにかかった時間を計算したい。 そのようなアクションにかかる時間は、ナノ秒のスペースです。APIはC++のクラス/関数であるため、私は同じことを計算するためにtimer.hを使用しています。

  #include <ctime>
  #include <iostream>

  using namespace std;

  int main(int argc, char** argv) {

      clock_t start;
      double diff;
      start = clock();
      diff = ( std::clock() - start ) / (double)CLOCKS_PER_SEC;
      cout<<"printf: "<< diff <<'\n';

      return 0;
  }

上記のコードでは秒単位で時間が表示されます。どうすれば同じものをナノ秒単位で、より正確に得ることができるでしょうか?

どのように解決するのですか?

他の方が投稿されている、関数をループで繰り返し実行する方法は正しいです。

Linux (および BSD) の場合は clock_gettime() .

#include <sys/time.h>

int main()
{
   timespec ts;
   // clock_gettime(CLOCK_MONOTONIC, &ts); // Works on FreeBSD
   clock_gettime(CLOCK_REALTIME, &ts); // Works on Linux
}

ウィンドウズでは QueryPerformanceCounter . そして、ここでは、さらに QPC

どうやら既知の 問題 の問題があることが知られています。さらに、一部のデュアル コア AMD では、QPC が原因で 問題 . sebbbi による 2 番目の投稿を参照してください。

QueryPerformanceCounter() と QueryPerformanceFrequency() は、もう少し解像度の高い はもう少し良い解決策を提供しますが、異なる問題があります。 とは異なる問題があります。たとえば Windows XPでは、すべてのAMD Athlon X2デュアルコアCPUは、いずれかのPCを返します。 コアCPUは、どちらかのコアのPCを返します。 コアのどちらかのPCを返します。 を返します(PCが少し後ろにジャンプすることもあります)。 AMDデュアルコアドライバを特別にインストールする パッケージのインストールが必要です。我々は 他のデュアル+コアCPUでは 同様の問題がある他のデュアルコアCPU(P4 dual, P4 ht, core2 dual、core2 quad、phenom quad)。

2013/07/16に編集しました。

にあるように、特定の状況下でのQPCの有効性については賛否両論あるようです。 http://msdn.microsoft.com/en-us/library/windows/desktop/ee417693(v=vs.85).aspx

...QueryPerformanceCounter および QueryPerformanceFrequency は通常、複数のプロセッサ用に調整されます。 BIOS やドライバーのバグにより、スレッドがあるプロセッサーから別のプロセッサーに移動すると、これらのルーチンが異なる値を返すことがあります。 BIOS やドライバーのバグにより、スレッドが 1 つのプロセッサから別のプロセッサに移動すると、これらのルーチンが異なる値を返す可能性があります。

しかし、この StackOverflow の回答は https://stackoverflow.com/a/4588605/34329 は、Win XP サービス パック 2 以降のすべての MS OS で QPC が問題なく動作することを述べています。

この記事では、Windows 7 がプロセッサに不変の TSC があるかどうかを判断し、ない場合は外部タイマーにフォールバックすることを説明しています。 http://performancebydesign.blogspot.com/2012/03/high-resolution-clocks-and-timers-for.html プロセッサ間で同期をとることはまだ問題です。

タイマーに関連するその他の細かい読み物。

詳しくはコメントをご覧ください。