6

重複の可能性:
C++でコードスニペットの実行時間を計算する方法

一部のC++コードの特定のステートメントセットに費やされた時間を取得するにはどうすればよいですか?

timeLinuxでのユーティリティのようなものですが、特定のステートメント専用です。

4

8 に答える 8

21

<chrono>標準ライブラリのヘッダーを使用できます。

#include <chrono>
#include <iostream>

unsigned long long fib(unsigned long long n) {
    return (0==n || 1==n) ? 1 : fib(n-1) + fib(n-2);
}

int main() {
    unsigned long long n = 0;
    while (true) {
        auto start = std::chrono::high_resolution_clock::now();
        fib(++n);
        auto finish = std::chrono::high_resolution_clock::now();

        auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(finish-start);
        std::cout << microseconds.count() << "µs\n";
        if (microseconds > std::chrono::seconds(1))
            break;
    }
}
于 2012-10-14T15:37:53.713 に答える
5

自分で時間を測定する必要があります。私が通常使用している小さなストップウォッチクラスは次のようになります。

#include <chrono>
#include <iostream>

template <typename Clock = std::chrono::steady_clock>
class stopwatch
{
    typename Clock::time_point last_;

public:
    stopwatch()
        : last_(Clock::now())
    {}

    void reset()
    {
        *this = stopwatch();
    }

    typename Clock::duration elapsed() const
    {
        return Clock::now() - last_;
    }

    typename Clock::duration tick()
    {
        auto now = Clock::now();
        auto elapsed = now - last_;
        last_ = now;
        return elapsed;
    }
};

template <typename T, typename Rep, typename Period>
T duration_cast(const std::chrono::duration<Rep, Period>& duration)
{
    return duration.count() * static_cast<T>(Period::num) / static_cast<T>(Period::den);
}

int main()
{
    stopwatch<> sw;
    // ...
    std::cout << "Elapsed: " << duration_cast<double>(sw.elapsed()) << '\n';
}

この名前の関数はすでに標準ライブラリに存在するため、duration_castは関数の最適な名前ではない可能性があります。より良いものを自由に考え出してください。;)

編集:クロノはC++11からのものであることに注意してください。

于 2012-10-14T15:37:37.807 に答える
3

std::chronoまたはboost::chrono(コンパイラがC ++ 11をサポートしていない場合)これに使用できます。

std::chrono::high_resolution_clock::time_point start( 
    std::chrono::high_resolution_clock::now() );
....
std::cout << (std::chrono::high_resolution_clock::now() - start);
于 2012-10-14T15:34:48.673 に答える
2

簡単なタイミングシステムを作成する必要があります。C++には組み込みの方法はありません。

#include <sys/time.h>

class Timer
{
private:
    struct timeval start_t;
public:
    double start() { gettimeofday(&start_t, NULL); }
    double get_ms() {
       struct timeval now;
       gettimeofday(&now, NULL);
       return (now.tv_usec-start_t.tv_usec)/(double)1000.0 +
              (now.tv_sec-start_t.tv_sec)*(double)1000.0;
    }
    double get_ms_reset() {
      double res = get_ms();
      reset();
      return res;
    }
    Timer() { start(); }
};

int main()
{
  Timer t();
  double used_ms;

  // run slow code..
  used_ms = t.get_ms_reset();

  // run slow code..
  used_ms += t.get_ms_reset();
  return 0;
}

測定自体がランタイムに大きな影響を与える可能性があることに注意してください。

于 2012-10-14T15:24:04.743 に答える
2

重複の可能性:C++でコードスニペットの実行時間を計算する方法

time.h C標準ライブラリを使用できます(詳細については、http: //www.cplusplus.com/reference/clibrary/ctime/を参照してください)。次のプログラムはあなたが望むことをします:

#include <iostream>
#include <time.h>

using namespace std;

int main()
{
    clock_t t1,t2;
    t1=clock();
    //code goes here
    t2=clock();
    float diff = ((float)t2-(float)t1)/CLOCKS_PER_SEC;
    cout << "Running time: " << diff << endl;

    return 0;
}

これを行うこともできます:

int start_s=clock();
// the code you wish to time goes here
int stop_s=clock();
cout << "time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl;
于 2012-10-14T15:42:02.137 に答える
1

GNU gcc / g ++を使用している場合:

--coverageを使用して再コンパイルし、プログラムを再実行して、gprofユーティリティを使用して結果のファイルを分析してみてください。また、関数の実行時間を出力します。

編集:コンパイルして、-coverageではなく-pgでリンクします。-coverageはgcov(実際に実行される行)用です。

于 2012-10-14T15:27:41.430 に答える
0

これは、WindowsとLinuxでうまく機能する非常に細かいコードスニペットです。https
://stackoverflow.com/a/1861337/1483826 これを使用するには、実行して結果を「開始時間」として保存し、アクションの後に「終了」します。時間"。必要な精度で減算および除算します。

于 2012-10-14T15:17:00.840 に答える
-1

#inclide <ctime>ヘッダーを使用できます。それは機能であり、それらの使用法はここにあります。コードが費やす時間を監視したいとします。そのパートの開始直前の現在の時刻と、そのパートの終了直後の別の現在の時刻を取得する必要があります。次に、これら2つの差を取ります。これらすべての作業を行うために、既製の関数が宣言されctimeています。上記のリンクをチェックしてください。

于 2012-10-14T15:24:33.643 に答える