1

アルゴリズムの CPU 時間を測定するために clock() を使用しています。

コードは次のようになります。

start_time = clock();
//code to be timed
.
end_time = clock();
elapsed_time = (end_time - start_time)*1000 / CLOCKS_PER_SEC;

printf("Time taken %d seconds %d milliseconds\n", elapsed_time/1000, elapsed_time%1000 );

しかし、結果として「0秒-175ミリ秒」になります。理由がわかりません。また、「1 秒 349 ミリ秒」には、実際には 10 分以上の時間がかかるようです。それは一般的ですか?

4

2 に答える 2

1

分岐は特殊なケースであり、このタイプのコードは負の時間になります。その理由の 1 つはclock()、プログラムの開始からのクロック ティックの数を返すことです。

念のため、値start_timeは子プロセスにコピーされます。

  • 親プロセスの場合、時間は正でなければなりません。start_timeとのクロックティックカウントend_timeは同じプロセスのためです。

  • 子プロセスの場合、 の fork()にのみ開始clock()されるため、プログラムがこの時点から実行されるクロック ティックの数が返されます。その前の時間fork()は記録されていません。

    クロックティックをカウントするための開始基準が異なるため:

    • start_timeプロセスの開始から最初のプロセスまでのクロック ティックの数です。clock()
    • end_timeは、プロセスの開始から 2 番目までのクロックティック数ですclock())

    マイナスの結果になることがあります。子プロセスが親プロセスの開始時間を超えるほど長く実行されている場合、肯定的な結果が得られる可能性もあります。

編集

予想される時間がわかりませんが、カウントしたい場合:親プロセスのクロックティックを開始から終了まで、子プロセスのクロックティックを後から終了まで、コードを変更してinの新しい値でfork()上書きします子プロセス。または、0に設定することもできます。start_timeclock()start_time

于 2012-05-30T01:34:50.307 に答える
0

start_time と end_time が 32 ビット整数の場合、CLOCKS_PER_SEC が 1000000 であるため、負の数にロールオーバーする前に約 2147 秒 (約 35 分) しか保持できません。

しかし、それよりも悪いのは、差に 1000 を掛けると、2.147 秒を超えるとオーバーフローすることになるからです。

一方、それらが 32 ビット整数でない場合は、間違った printf 形式指定子を使用しているため (おそらく、コンパイラからの警告を受けて無視している可能性があります)、ゴミが表示されます。

于 2012-05-30T01:25:50.773 に答える