1

シーケンシャル、再帰バイナリ、反復バイナリの 3 種類の検索にかかる時間を計っています。私はそれらを適切に配置しており、反復して検索を終了します。私の問題は、それらすべての時間を計ると、100,000 の配列を作成しても、毎回すべての値が 0 になり、配列にないものを検索することです。検索にブレークポイントを設定すると、明らかに時間が長くなり、作業できる妥当な時間が得られます。しかし、それ以外の場合は常に 0 です。これが私のコードです。3 つの検索タイマーすべてで同様です。

 clock_t recStart = clock();
 mySearch.recursiveSearch(SEARCH_INT);
 clock_t recEnd = clock();
 clock_t recDiff = recEnd - recStart;
 double recClockTime = (double)recDiff/(double)CLOCKS_PER_SEC;
 cout << recClockTime << endl;

 cout << CLOCKS_PER_SEC << endl;

 cout << recClockTime << endl;

最後の 2 つについては、 と を取得10000ます。

ここで何か間違ったことをしていますか?それとも私の検索オブジェクトにありますか?

4

2 に答える 2

3

clock()正確なタイマーではなく、短い間隔のタイミングにはうまく機能しません。

C は、クロックは、プログラムの呼び出しのみに関連する実装定義の時代の始まり以降、プログラムによって使用されたプロセッサ時間に対する実装の最良の概算を返すと言います。

プログラムする 2 つの連続するクロック呼び出しの間の時間がクロック関数の 1 ユニティよりも短い場合、0 になる可能性がありclockます。CLOCKS_PER_SEC1000000

( http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html )

x86/x64 でクロック サイクルを測定するには、アセンブリを使用して CPU タイム スタンプ カウンター レジスタのクロック カウントを取得しますrdtsc。(これはインライン アセンブルによって実現できますか?) 経過秒数ではなく、タイム スタンプを返すことに注意してください。そのため、CPU 周波数も取得する必要があります。

ただし、正確な時間を秒単位で取得する最善の方法は、プラットフォームによって異なります。


clock_t要約すると、秒単位で正確に計算して印刷することは事実上不可能です。より良いアプローチを見つけるために、これを Stackoverflow で確認することをお勧めします (精度が最優先の場合)。

于 2013-02-17T02:33:54.660 に答える
2

clock()十分な解決策がありません-これは、そのトピックに関する良いディスカッション/ブログです http://www.guyrutenberg.com/2007/09/10/resolution-problems-in-clock/

OProfileまたはCodeAnalystclock_gettimeを使用するか、または使用することを検討した方がよい2 つのオプションがあると思いますか?

私は個人的にツールを使用することを好みます - OProfile は良いです。私は以前に CodeAnalyst を使用したことがありません - そして、Valgrind と gprof があります。

どうしても使用したい場合は、http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/clock_gettimeをチェックして ください。

于 2013-02-17T03:55:39.687 に答える