Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

計算処理時間を出力したい!

素因数分解を行うプログラムにおいて、処理時間を計算する必要があります。 #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秒単位で出てきているとおもいます。 もっと細かい時間を計測するのにはどうしたらいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.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って何!? */ }

ichiro29
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • madman
  • ベストアンサー率24% (612/2465)
回答No.4

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系だと解りません。

ichiro29
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • bagyo
  • ベストアンサー率40% (16/40)
回答No.3

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

ichiro29
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • don_cha
  • ベストアンサー率34% (139/407)
回答No.2

WindowsのAPIでQueryPerformanceFrequencyとQueryPerformanceCounterを使えば、CPUにもよりますが、高分解能で出てきます。 また、Windowsでない場合、同一処理を数千回~数万回の単位繰り返し処理させ、その時に掛かった処理時間/実行回数の平均を取ると大体の1回辺りの処理速度が計算できます。

ichiro29
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

質問での例だと最適化されてfor分自体が無くなってしまう可能性がありますね。 もう少し何かをやらせるようにしないと例として成り立ちません。

ichiro29
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A