7

特定のコードにかかる時間を測定したいとします。そのために、私は通常、このようなことをします

clock_t startTime = clock();
//do stuff
//do stuff
//do stuff
//do stuff
float secsElapsed = (float)(clock() - startTime)/CLOCKS_PER_SEC;

プログラムがマルチスレッド化されていて、測定したい部分でコンテキストの切り替えが発生した場合はどうなりますか? 他のスレッドで費やされた時間を除いて、コードの実行にかかる時間をどのように測定しますか? それを行うツールがあったとしても、それがどのように行われているかを知りたいです。

4

4 に答える 4

4

コードの実行にかかる時間を測定するには、さまざまな方法があります。

特定の関数の相対的なパフォーマンスに関心がある場合は、プロファイラーが唯一の方法です。これにより、計算オーバーヘッドが誘発されるため、ブロッキング I/O の影響が強調されなくなることに注意してください。

特定の機能の時計ベースの時間が必要な場合は、オプションがたくさんあります。

個人的にはgettimeofdayで十分だと思います。

正確に取得したい場合は、 RDTSCを使用してください

本当に正確に取得したい場合は、このようなものが必要になります

t1 = rdtsc();
t2 = rdtsc();
my_code();
t3 = rdtsc();
my_code_time = (t3-t2) - (t2-t1)

スレッド スケジューリングの不一致を考慮し、キャッシュ効果にも注意を払うために、このブロックを繰り返す必要があります。

于 2011-09-21T11:11:49.910 に答える
2

これが、コードのベンチマークが基本的にうまくいかない理由です。どれくらいの時間がかかるかを知ることができないからです。OS にプリエンプトされるようなことは、せいぜい予測不可能です。プロのプロファイラーを使用してください。プロファイラーには、これらの問題に対処できるコードが含まれているか、気にしないコードが含まれている可能性があります。スタイルを書くclock()ことはまったく無意味です。

于 2011-09-21T11:14:38.303 に答える