web-dev-qa-db-ja.com

Cで時間を測定するにはどうすればよいですか?

コードのブロックが(およそ)どれくらいの時間実行されるかを知りたいです。このようなもの:

startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);

どうやって?

40
snakile

time.hclockメソッドを使用できます

例:

clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
61
KLee1

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日)以降の秒数を記録します。

18
Stephen

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);
}
2
selbie

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;
}
1
Ivan Talalaev

Windows APIの QueryPerformanceCounter および QueryPerformanceFrequency 関数を使用します。前者をブロックの前後に呼び出し、(current-old)を減算して、インスタンス間の「ティック」の数を取得します。これを後者の関数によって取得された値で除算して、秒単位の期間を取得します。

1

素晴らしい解像度が必要ない場合は、GetTickCount()を使用できます。 http://msdn.Microsoft.com/en-us/library/ms724408(VS.85).aspx (それが独自の単純な診断以外の場合は、この数値が折り返す可能性があることに注意してください。そのため、少し算術で処理する必要があります。

QueryPerformanceCounterは別の妥当なオプションです。 (MSDNでも説明されています)

0
user357501