C++ コードの実行時間を測定したいと考えています。コードの実行には約 12 時間かかりますが、今回はコードの実行の最後に書き込みたいと思います。私のコードでそれを行うにはどうすればよいですか?
オペレーティング システム: Linux
C++11 を使用している場合は、次を使用できますsystem_clock::now()
。
auto start = std::chrono::system_clock::now();
/* do some work */
auto end = std::chrono::system_clock::now();
auto elapsed = end - start;
std::cout << elapsed.count() << '\n';
期間を表すために使用する粒度を指定することもできます。
// this constructs a duration object using milliseconds
auto elapsed =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
// this constructs a duration object using seconds
auto elapsed =
std::chrono::duration_cast<std::chrono::seconds>(end - start);
C++11 を使用できない場合は、Boostのchronoを参照してください。
このような標準ライブラリを使用することの最も良い点は、移植性が非常に高いことです (たとえば、どちらも Linux と Windows で動作します)。したがって、後でアプリケーションを移植することにした場合でも、あまり心配する必要はありません。
これらのライブラリは、C のようなアプローチとは対照的に、最新の C++ 設計にも準拠しています。
編集:上記の例は、壁時計の時間を測定するために使用できます。ただし、プログラムの実行時間を測定する方法はこれだけではありません。まず、ユーザー時間とシステム時間を区別できます。
目的によっては、システム時間をプログラムの実行時間の一部として考慮する必要がある場合と考慮しない場合があります。たとえば、目的がユーザー コードのコンパイラの最適化を測定することだけである場合は、おそらくシステム時間を除外することをお勧めします。一方、ユーザーがシステム コールが大きなオーバーヘッドであるかどうかを判断したい場合は、システム時間も測定する必要があります。
さらに、最近のほとんどのシステムはタイムシェアリングされているため、異なるプログラムが複数のコンピューティング リソース (CPU など) に対して競合する場合があります。このような場合、別の区別を行うことができます。
CPU 時間を測定するために、Boost には追加のクロックのセットが含まれています。
process_real_cpu_clock
、現在のプロセスによって費やされたウォール クロック CPU 時間をキャプチャします。process_user_cpu_clock
、現在のプロセスで費やされたユーザー CPU 時間をキャプチャします。process_system_cpu_clock
、現在のプロセスによって費やされたシステム CPU 時間をキャプチャします。process_cpu_clock
実際のユーザー CPU とシステム CPU の処理時間をまとめて取得する、タプルのようなクラス。thread_clock
スレッド安定クロック (プラットフォームでサポートされている場合)。残念ながら、C++11 にはそのようなクロックはありません。しかし、Boost は広く使用されているライブラリであり、おそらく、これらの余分なクロックはある時点で C++1x に組み込まれるでしょう。そのため、Boost を使用すると、新しい C++ 標準で追加されたときに準備が整います。
最後に、(プログラムにコードを追加するのではなく) コマンド ラインからプログラムを実行するのにかかる時間を測定したい場合は、@BЈовић が示唆するように、 timeコマンドを調べることができます。ただし、このアプローチでは、プログラムの個々の部分 (関数の実行にかかる時間など) を測定することはできません。
C++11 での実行時間の測定にはstd::chrono::steady_clock
and notを使用します。std::chrono::system_clock
理由は次のとおりです(system_clock
のドキュメントを引用):
ほとんどのシステムでは、システム時刻はいつでも調整できます
一方、steady_clock は単調であり、間隔の測定に適しています。
クラス std::chrono::steady_clock は単調時計を表します。この時計の時点は、物理的な時間が進むにつれて減少することはありません。この時計は壁時計の時間とは関係がなく、間隔を測定するのに最適です。
次に例を示します。
auto start = std::chrono::steady_clock::now();
// do something
auto finish = std::chrono::steady_clock::now();
double elapsed_seconds = std::chrono::duration_cast<
std::chrono::duration<double> >(finish - start).count();
ちょっとした実用的なヒント: 実行時間を測定していて、秒数を報告したい場合は、整数std::chrono::duration_cast<std::chrono::seconds>
の秒数が得られるため、必要になることはめったにありません。上記の例を使用して時間を秒単位で取得します。double
時間を使ってプログラムを開始できます。終了すると、プログラムの実行に関するナイスタイムの統計が出力されます。何を印刷するかを簡単に設定できます。デフォルトでは、プログラムの実行にかかったユーザー時間と CPU 時間が出力されます。
編集 : アプリケーションが他のプログラムによってブロックされ、間違った値が返されるため、コードのすべての測定値が正しくないことに注意してください*。
*間違った値とは、プログラムの実行にかかった時間を簡単に取得できるという意味ですが、その時間はプログラム実行中の CPU の負荷によって異なります。CPU 負荷に依存しない比較的安定した時間測定を行うには、時間を使用してアプリケーションを実行し、測定結果として CPU を使用できます。
私は私のプロジェクトの1つでこのようなものを使用しました:
#include <sys/time.h>
struct timeval start, end;
gettimeofday(&start, NULL);
//Compute
gettimeofday(&end, NULL);
double elapsed = ((end.tv_sec - start.tv_sec) * 1000)
+ (end.tv_usec / 1000 - start.tv_usec / 1000);
これはミリ秒単位で、C と C++ の両方で機能します。