コードのブロックが(およそ)どれくらいの時間実行されるかを知りたいです。このようなもの:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
どうやって?
time.h でclock
メソッドを使用できます
例:
clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
time.h ライブラリ、特に time および difftime 関数を使用できます。
/* difftime example */
#include <stdio.h>
#include <time.h>
int main ()
{
time_t start,end;
double dif;
time (&start);
// Do some calculation.
time (&end);
dif = difftime (end,start);
printf ("Your calculations took %.2lf seconds to run.\n", dif );
return 0;
}
(上記のリンクされたdifftime Webページからの適合例。)
この方法では数秒の精度しか得られないことに注意してください-time_t
は、 NIXエポック (1970年1月1日)以降の秒数を記録します。
GetTickCount()。
#include <windows.h>
void MeasureIt()
{
DWORD dwStartTime = GetTickCount();
DWORD dwElapsed;
DoSomethingThatYouWantToTime();
dwElapsed = GetTickCount() - dwStartTime;
printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}
CPU時間ではなく天文時間を測定する必要がある場合があります(特にこれはLinuxで適用可能):
#include <time.h>
double what_time_is_it()
{
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
return now.tv_sec + now.tv_nsec*1e-9;
}
int main() {
double time = what_time_is_it();
printf("time taken %.6lf\n", what_time_is_it() - time);
return 0;
}
Windows APIの QueryPerformanceCounter および QueryPerformanceFrequency 関数を使用します。前者をブロックの前後に呼び出し、(current-old)を減算して、インスタンス間の「ティック」の数を取得します。これを後者の関数によって取得された値で除算して、秒単位の期間を取得します。
素晴らしい解像度が必要ない場合は、GetTickCount()を使用できます。 http://msdn.Microsoft.com/en-us/library/ms724408(VS.85).aspx (それが独自の単純な診断以外の場合は、この数値が折り返す可能性があることに注意してください。そのため、少し算術で処理する必要があります。
QueryPerformanceCounterは別の妥当なオプションです。 (MSDNでも説明されています)