プログラムの実行時間の計測について質問させていただきます。
現在,実行時間の計測で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
No.1
- 回答日時:
clock関数というのは、その処理系での最良の近似を返すことだけが規定されており、分解能や精度などに関しては一般的には何も保証されません。
ですから、常に123という値が返ってきたとしても、性能面はともかく、規格上の機能要件は満たしていることになります。また、プロセッサ時間が無効か表現不能の場合には(clock_t)-1を返します。特定の処理系に関する情報が欲しいのであれば、まずはその処理系のマニュアルを熟読してください。それでもわからなければユーザーサポートを利用するか、最低限、対象となる処理系を特定した上で再質問してください。
No.2
- 回答日時:
t1~t4の変数がオーバーフローしているのではないでしょうか?
CLOCKS_PER_SEC=100,000として、オーバーフローしていると考えると、Totalの本来の時間は (t4-t1) の 1376902104 に 2^32=4294967296 を加えた時間になります。
これは 5671869400 となり、CLOCKS_PER_SECで割ると約5,672秒(約95分)となりますね。
この回答への補足
回答していただいてありがとうございます。
2^31でオーバーフローしていました。ということは90分を超えたりする
とclock()は使えないですよね。
time.hの関数を見たところ時間が測れるもので大きい数に対応している
ようなものはないように思えます。小刻みに時間を測るのでしょうか?
何か良い方法はありますか?よろしかったら教えてください。
No.3ベストアンサー
- 回答日時:
> time.hの関数を見たところ時間が測れるもので大きい数に対応している
> ようなものはないように思えます。小刻みに時間を測るのでしょうか?
> 何か良い方法はありますか?よろしかったら教えてください。
例えば、time() 関数と difftime()関数を使用すれば精度が秒ですが、長い時間をはかることができます。
clock()関数を使用するなら、やっぱり小刻みに時間をとっていくのが一番簡単かもしれません。
参考URL:http://www.bohyoh.com/CandCPP/C/Library/time.htm …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
小数点切捨て表示
-
cshの文字列操作(0埋め)
-
c言語でAからZまでを表示する...
-
scanfに文字が入力されたときに...
-
球の体積と表面積を表示するプ...
-
Cプログラムについて
-
unsigned int型について
-
コマンドラインに出力した文字...
-
C言語について
-
筆算(加法)について
-
一番大きい奇数を表示する
-
コーディング
-
【C言語教えてください】sin波...
-
三平方の定理を求めるプログラム
-
2進数の加算の繰り上がり
-
C言語についてなのですが、
-
C言語のじゃんけんゲームのプロ...
-
C言語での、年複利の計算方法...
-
C言語です このプログラミング...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報