こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

clock()関数の誤差

プログラムの実行時間の計測について質問させていただきます。
現在,実行時間の計測でclock()関数を使っているのですが誤差が出ます。
timeコマンド(と実際に時計で測った時間)では95分、clock()関数で測った
プログラム全体の実行時間は1376秒(約23分)と誤差が出る状態にあります。
プログラムでclock()関数を使っているのはmain()だけです。
printf()内がおかしいのでしょうか?
詳しい方、回答よろしくおねがいします。

↓プログラム
#include<time.h>
(中略)
clock_t t1,t2,t3,t4;
(中略)

main()
{
struct zahyo P,Q;
int a,b,prime,Ord,sec;

scanf("%d",&a);
(中略)
printf("Q.y = "); scanf("%d",&Q.y);

t1=clock();
Ord=OrdCal(P,a,prime);
t2=clock();
printf("Ord = %d\n",Ord);
printf("OrdCal:%f(s)\n",(double)(t2-t1)/CLOCKS_PER_SEC);
t3=clock();
PohlingBsgs(P,Q,a,prime,Ord);
sec=secretkey();
t4=clock();
printf("secretkey=%d\n",sec);
printf("Decipher:%f(s)\n",(double)(t4-t3)/CLOCKS_PER_SEC);
printf("Total :%f(s)\n",(double)(t4-t1)/CLOCKS_PER_SEC);
}

実行結果
Ordcal:74.170000(s)
Decipher:1302.722704(s)
Total :1376.902104(s)

real 94m33.445s
user 94m30.900s
sys 0m0.980s

投稿日時 - 2007-01-11 14:02:13

QNo.2658573

困ってます

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

> time.hの関数を見たところ時間が測れるもので大きい数に対応している
> ようなものはないように思えます。小刻みに時間を測るのでしょうか?
> 何か良い方法はありますか?よろしかったら教えてください。

例えば、time() 関数と difftime()関数を使用すれば精度が秒ですが、長い時間をはかることができます。
clock()関数を使用するなら、やっぱり小刻みに時間をとっていくのが一番簡単かもしれません。

参考URL:http://www.bohyoh.com/CandCPP/C/Library/time.html,http://www.bohyoh.com/CandCPP/C/Library/difftime.html

投稿日時 - 2007-01-12 11:01:50

お礼

time() 関数とdifftime()関数ですね。やってみます。
分かるまで教えていただいてありがとうございました!

投稿日時 - 2007-01-12 12:51:38

このQ&Aは役に立ちましたか?

19人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

t1~t4の変数がオーバーフローしているのではないでしょうか?

CLOCKS_PER_SEC=100,000として、オーバーフローしていると考えると、Totalの本来の時間は (t4-t1) の 1376902104 に 2^32=4294967296 を加えた時間になります。
これは 5671869400 となり、CLOCKS_PER_SECで割ると約5,672秒(約95分)となりますね。

投稿日時 - 2007-01-11 14:57:18

補足

回答していただいてありがとうございます。
2^31でオーバーフローしていました。ということは90分を超えたりする
とclock()は使えないですよね。
time.hの関数を見たところ時間が測れるもので大きい数に対応している
ようなものはないように思えます。小刻みに時間を測るのでしょうか?
何か良い方法はありますか?よろしかったら教えてください。

投稿日時 - 2007-01-11 20:47:10

ANo.1

clock関数というのは、その処理系での最良の近似を返すことだけが規定されており、分解能や精度などに関しては一般的には何も保証されません。ですから、常に123という値が返ってきたとしても、性能面はともかく、規格上の機能要件は満たしていることになります。また、プロセッサ時間が無効か表現不能の場合には(clock_t)-1を返します。

特定の処理系に関する情報が欲しいのであれば、まずはその処理系のマニュアルを熟読してください。それでもわからなければユーザーサポートを利用するか、最低限、対象となる処理系を特定した上で再質問してください。

投稿日時 - 2007-01-11 14:48:45

お礼

回答していただいてありがとうございました!

投稿日時 - 2007-01-12 12:52:43

あなたにオススメの質問