この掲示板を始めて使わせていただきます。
よろしくお願いいたします。
今回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の暗いまで四捨五入されてるように見えます。どうすれば正確なクロック数が測れるでしょうか。
よろしくお願いいたします
Googleで"Red Hat Linux Gcc clock()"なんてキーワードで検索したところ
http://his.luky.org/ML/linux-users.a/msg00103.html
というページがヒットしました。
この質問に対するフォロー中に答えが見つかりそうです。
ところで、この掲示板は「Visual C++ Q & A掲示板」なんですが...
その結果が間違っている、ないしは不正確であると判断した根拠は?
まったくもって極めて正しい結果だと思われるが。
# マルチするな
t0 と t1 の間隔をいくら広げても結果は変わらないんです。
ずっと10000,20000などとぴったりなのも納得がいきません。
よろしくお願いいたします。
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より正確なものを使用する。
というかそっちがいいんだけどね。
俺はそれがなんなのか知らん。
1000と10000を間違えてたか。
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 精度が得られているということ。
きわめて正常で納得のいく結果が得られているな。
ツイート | ![]() |