-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.68109
  • 閲覧数815
  • ありがとう数6
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 57% (27/47)

素因数分解を行うプログラムにおいて、処理時間を計算する必要があります。
#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秒単位で出てきているとおもいます。
もっと細かい時間を計測するのにはどうしたらいいのでしょうか?
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル12

ベストアンサー率 75% (398/526)

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

お礼率 57% (27/47)

ありがとうございました。
無事解決することができました。
投稿日時 - 2001-04-27 13:01:24
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル14

ベストアンサー率 47% (11786/24626)

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

お礼率 57% (27/47)

ありがとうございました。
無事解決いたしました…。
投稿日時 - 2001-04-27 12:58:26


  • 回答No.2
レベル11

ベストアンサー率 34% (139/407)

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

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

お礼率 57% (27/47)

ありがとうございました。
無事解決いたしました…。
投稿日時 - 2001-04-27 12:59:00
  • 回答No.3
レベル8

ベストアンサー率 40% (16/40)

こんにちわ。

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

お礼率 57% (27/47)

ありがとうございました。
無事解決することができました…
投稿日時 - 2001-04-27 12:59:58
  • 回答No.4
レベル14

ベストアンサー率 24% (612/2465)

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

お礼率 57% (27/47)

ありがとうございました。
無事解決いたしました…。
投稿日時 - 2001-04-27 13:00:38
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ