0

「古い」バージョンを使用しているときに C++ で実行時間 (壁時間) を測定するための推奨される方法は何ですか? g++ は 4.6.3 (古くはありませんが、c++0x11 ではなく、-std=c++0x スイッチはありません)、boost も古い 1.46.1 です。

CPUサイクルを測定するclock()を試しました。CPUサイクルも測定するboost::timer()を試しました。C 関数を使用する必要がありますか?

問題があれば、これは 3.5 カーネルの Ubuntu Linux です。c++0x スイッチを追加したり、コンパイラやブースト ライブラリをアップグレードしたりできないと仮定した場合のベスト プラクティスを見つけたいと思います。

参考までに、以下のコードを使用してさまざまな機能をテストしています。結果は、cin 呼び出しで待機する数秒ではなく、約 0.2 秒です。

{
  boost::timer t;

  for (int i = 0; i < 99999999; i ++) ;

  std::string sin;
  std::cin >> sin;

  std::cout << t.elapsed() << std::endl;
}
4

2 に答える 2

0

boost::timer は clock() によって実装されました。Linux の場合、 time.h に含まれる clock() の戻り値は、プログラムが占有したCPU 時間であり、プログラムの経過時間ではなく、 CLOCKS_PER_SECで割ったものです。を指しman 3 clockます。あなたのコードによるとstd::cin >> sin;、CPU時間を占有しません。

ブースト タイマークラス:

class timer
{
 public:
  timer() { _start_time = std::clock(); } // postcondition: elapsed()==0
   ...
  double elapsed() const                  // return elapsed time in seconds
    { return  double(std::clock() - _start_time) / CLOCKS_PER_SEC; }

 private:
  std::clock_t _start_time;
}; 
于 2013-08-22T02:15:22.420 に答える
0

C/POSIX を使用します。

clock_gettime(CLOCK_MONOTONIC, ...);

timespec構造体メンバーを処理する必要がないように、C++ 関数にラップすると便利です。long longすべてをorに結合することをお勧めしますdouble

例:

double getTimeInSeconds()
{
    struct timespec result;
    if (clock_gettime(CLOCK_MONOTONIC, &result))
        throw ...something...;
    return result.tv_sec + (result.tv_nsec / 1000000000.);
}

librt に対してリンクする (つまり-lrt、リンカー オプションに追加する) 必要があるかもしれません。

于 2013-08-14T04:11:54.780 に答える