clock()を使ったファンクションの使用時間計測


nick  2007-11-29 11:59:09  No: 67025

この掲示板を始めて使わせていただきます。
よろしくお願いいたします。

今回Red Hat LinuxのGccをつかってCプログラムを書いております。
そこでプログラムの中でところどころ作業時間を計りたいと思って次のようにclock()を使ったところ下のように出てきました。

#include <time.h>
int main()
{
clock_t t0,t1;
while(1)
{ t0=clock();
...
...
add(a,b)
...
t1=clock()
printf("%ld,%ld\n",t0,t1);
}
}

出力画面:

0,0
0,0
...
...
10000,10000
10000,10000
...
...
20000,20000
...

出力画面を見る限り10000の暗いまで四捨五入されてるように見えます。どうすれば正確なクロック数が測れるでしょうか。

よろしくお願いいたします


maru  2007-11-29 18:32:52  No: 67026

Googleで"Red Hat Linux Gcc clock()"なんてキーワードで検索したところ
http://his.luky.org/ML/linux-users.a/msg00103.html
というページがヒットしました。
この質問に対するフォロー中に答えが見つかりそうです。

ところで、この掲示板は「Visual C++ Q & A掲示板」なんですが...


tetrapod  2007-11-29 18:46:22  No: 67027

その結果が間違っている、ないしは不正確であると判断した根拠は?
まったくもって極めて正しい結果だと思われるが。
# マルチするな


nick  2007-11-29 22:35:34  No: 67028

t0 と  t1 の間隔をいくら広げても結果は変わらないんです。
ずっと10000,20000などとぴったりなのも納得がいきません。
よろしくお願いいたします。


wclrp ( 'o')  2007-11-30 10:16:22  No: 67029

Red Hat LinuxのGccのclockを知らんので推測です。

仕様としてclockが決められていても
コンピュータの機能やclockの実装の関係で
1000単位でしか変化しないこともあるんじゃないの。

よくあることですよ。

実際の時間的には9999でもclockが0を返すかもしれない。

以下は動作確認していません。

t1=clock();
while(1) { t0=clock(); if(t0!=t1) break; }
i=0;
while(1) { t1=clock(); ++i; add(a,b);
 if(t0+1000=<t1) break; }
printf("%ld,%f\n",i,double(t1-t0)/i);

まず、時間がちょうど切り替わるタイミングを計る。
つぎに、時間が1000経過するまで計る。
iがオーバーフローしない前提です。
iで割れば1回あたりのaddの処理時間です。

あるいは、clockより正確なものを使用する。
というかそっちがいいんだけどね。
俺はそれがなんなのか知らん。


wclrp ( 'o')  2007-11-30 10:17:51  No: 67030

1000と10000を間違えてたか。


tetrapod  2007-11-30 21:25:36  No: 67031

http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+31104
でもコメントがついている通り CLOCKS_PER_SEC の値を確認してみよう
printf("CLOCKS_PER_SEC=%ld\n", (long)CLOCKS_PER_SEC);
多分 10000000 だと思われる。

使う単位と得られる精度の違いなだけだ

マシンやOSによっては clock の結果としてマイクロ秒精度の値が実際に得られるものもある
そーいうマシンとの互換性のために clock の返す単位が usec になっている
しかし nick 氏の使っているマシンではそういう精度が得られないだけだ。
10000 ごとにしか変わらないのであれば 10msec 精度が得られているということ。
きわめて正常で納得のいく結果が得られているな。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加