プロが教える店舗&オフィスのセキュリティ対策術

素因数分解を行うプログラムにおいて、処理時間を計算する必要があります。
#include <stdio.h>
#include <time.h>

main()
unsigned long i,t0,t1;
t0 = clock();
for(i=0; i<100000; i++){

}
t1 = clock();
printf("Time : %lf\n", t1 - t0);
}

などと例を作ってテストしているのですが、小さな単位まで出てきません。
100分の1秒単位で出てきているとおもいます。
もっと細かい時間を計測するのにはどうしたらいいのでしょうか?

A 回答 (5件)

clock()は標準関数なので、ちょっと調べれば正しい使い方がすぐわかると思いますが・・・



まずclockの戻値はtime.h内で定義されている、clock_t型で受け取るようにしましょう。
あなたの環境ではたまたまunsigned longで実装されているのかもしれませんが、他の環境やバージョンでもそうだとは限りませんよ?

それからprintfの中ですが、unsigned long同士の引き算の結果はunsigned longになりますので、double型を期待する%lfでは正しく表示されません。
(正しく表示するには%luを使うか、(double)t1-t0としてキャストする。)

clock関数は1秒より小さい単位で時間を計測しますが、それは小数型で計測しているのではなく、秒より小さい単位を使って整数型で計測しています。(つまり単位は秒ではありません。)
これを秒単位に直すには、time.h内で定義されているCLK_TCKマクロを使います。

ではでは、下のサンプルを参考にしてみてください。

#include <stdio.h>
#include <time.h>

void main()
{
  clock_t t0, t1;
  int i;

  t0 = clock();
  for (i = 0; i < 100000; i++) {
    /* 重い処理。バブルソートなんかいいかもね */
  }
  t1 = clock();

  printf("Time:%f\n", (t1-t0) / CLK_TCK);
  /* そういやdoubleは%fでした。long doubleは%Lfだし…。%lfって何!? */
}
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事解決することができました。

お礼日時:2001/04/27 13:01

unixであればgettimeofdayで秒とマイクロ秒が取得できます。



struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

です。
加工すれば、目的となる数値が計算できるでしょう。
forのループは中で何か計算しないと最適化されて無くなるおそればあります。
また、unsigned longの値をdouble型で出力するのもどうかと思われます。


#include <sys/time.h>
#include <unistd.h>

main(){
struct timeval tm;
struct timezone tz;

gettimeofday(&tm, &tz);
}

windows系だと解りません。
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事解決いたしました…。

お礼日時:2001/04/27 13:00

こんにちわ。



これは、プログラミングをしている環境(OS)によって違ってくるのではないでしょうか?
例えば、FreeBSD(UNIX系?)ではgetrusageというシステムコールがあり、これを利用することで計測することができます。
あとは、複数回の計測を行い、上下のデータを外した平均を取るという方法もあったはずです。少なくとも1回の計測では、キャッシュの影響などが大きく出すぎるのではないかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事解決することができました…

お礼日時:2001/04/27 12:59

WindowsのAPIでQueryPerformanceFrequencyとQueryPerformanceCounterを使えば、CPUにもよりますが、高分解能で出てきます。



また、Windowsでない場合、同一処理を数千回~数万回の単位繰り返し処理させ、その時に掛かった処理時間/実行回数の平均を取ると大体の1回辺りの処理速度が計算できます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事解決いたしました…。

お礼日時:2001/04/27 12:59

質問での例だと最適化されてfor分自体が無くなってしまう可能性がありますね。


もう少し何かをやらせるようにしないと例として成り立ちません。
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事解決いたしました…。

お礼日時:2001/04/27 12:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!