• ベストアンサー

clock関数での経過時間計測

clock関数でプログラムの時間を計測しようと思っているのですがうまくいきません。 ----------------------------- clock_t start,end; start = clock(); (処理) end = clock(); printf("かかった時間:%f",(double)(end-start)/CLOCKS_PER_SEC); ----------------------------- 上のようにしているのですが、実行結果は0.00000秒と出てしまいます。処理のところは足し算を何題か出題し解答を入力し正解したら次の問題というようなことをしています。 確認のためstartにclock()を代入した後とendに代入したあとでprintfでstartとendを出力してみましたが、どちらの値も10.00000で同じ値となっています。0秒になるのはこれのせいだと思うのですが、どうして同じ値になるのでしょうか?

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

  • ベストアンサー
  • rigidbody
  • ベストアンサー率60% (20/33)
回答No.2

>どうして同じ値になるのでしょうか? (処理)が、clock()値に対して速すぎるからだと思います。 clock()での区間計測は、一般に低精度です。 WinならQueryPerformanceCounter()を使ってみて下さい。それ以外の環境でかつIA32なら、RDTSC命令が有効です。

mago83
質問者

お礼

QueryPerformanceCounter()を使ったらうまくいったのでそちらの方法を使ってみることにします。ありがとうございました。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

処理系等にも依存しますが、clock関数の分解能に比べて、処理が短すぎることが原因かと思います。 clock_tの精度と実際の分解能は必ずしも一致していません。例えば、clock_tが1msec単位であったとしても、実際の分解能が50msecしかない場合もあるわけです。 分解能の悪さに対する対策としては、同じ処理を1000回とか10000回とか繰り返して、その時間を計測するのが常套手段ですが、繰返しができないようなものや、高い計測精度を必要とする場合は、別の方法を検討するしかありません。

関連するQ&A

  • 時間を経過させる関数

    この関数は引数xに1000を渡すと1秒の経過をさせる 関数です。 int sleep(unsigned long x) { clock_t c1 = clock(),c2; do { if((c2 = clock()) == (clock_t)-1) return 0; }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } 質問は3つです。 (1) if((c2 = clock()) == (clock_t)-1) return 0; ・clock()を呼び出し、その結果をc2に代入する。c2が-1だったら、returnする。返却値は0を返す。 つまり、時間の経過中にエラーが起きたら値を返すというものです。 質問としては、「(clock_t)-1」の意味です。「clock_t型から-1を引く?」なぜ-1と等しいのでしょうか? (2) while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); この文なのですが、なぜc2からc1を引く理由としては ・c1は関数を呼び出した時点の時間であり0秒固定。 ・c2に関しては「上記の不等式が不成立になるまで経過する時間」 と考えてよろしかったでしょうか? (3) また、上記の文の不等式の右辺のxは単位がミリ秒なので、不成立になるには、不等 式の左側は「関数呼び出しから現在までの経過時間(ミリ秒)」になるはずです。 左辺は最初に(c2-c1)を1000倍をしてそこからCLOCKS_PER_SECという 一秒あたりのクロック数(1000)を割っているのでc2やc1は最初から ミリ秒の単位がclock()で渡されるということなのでしょうか? お手数ですがよろしくお願いします。

  • clock関数を利用した時間計測法について

    以下のソースコードについての質問です。 --- /* 文字列を1文字ずつ表示して後ろから1文字ずつ消去するのを繰り返す */ #include <time.h> #include <stdio.h> /*--- xミリ秒経過するのを待つ ---*/ int sleep(unsigned long x) { clock_t c1 = clock(), c2; do { if ((c2 = clock()) == (clock_t)-1) /* エラー */ return (0); } while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); return (1); } --- このコード中の while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); の箇所で、整数の 1000 ではなく、実数の 1000.0 を使う意味(メリット)は オーバーフロー対策の他に何かありますか? ありましたら教えてください。 また、整数の1000に比べ実数の1000.0を含む計算(浮動小数点演算)に 極端に時間がかかる環境の場合、 実数を使う方がsleep関数の精度が劣るデメリットがあると思いますが、 その他に実数を使う場合のデメリットはありますか? ありましたら教えてください。 (コードにおいて、clock_t型はunsignedと同義の場合もあれば signed long intと同義の場合もあると思いますが、どれもありうる(処理系依存)と考えてください。 CLOCKS_PER_SECも1000や1000000の場合もあると思いますが、どれもありうる(処理系依存)と考えてください。)

  • 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

  • clock関数は正確じゃないの?

    clock関数で時間を計測するとどうも狂ってしまいます。 おかしいので、このようなプログラムでclock関数の精度を調べてみました。 #include <stdio.h> #include <time.h> int main(){     int i,j;     clock_t start;     for(i=0;i<50;i++){         start = clock();         for(j=0;j<3000000000;j++);         printf("%4.3f秒\n",(double)(clock()-start)/CLOCKS_PER_SEC);         }     return 0; } このプログラムの実行結果はこちらです。 1.672秒 1.672秒 1.672秒 1.672秒 1.687秒←● 1.672秒 1.672秒 1.672秒 1.672秒 1.672秒 1.671秒 1.672秒 1.672秒 1.672秒 1.688秒←● ・・(略) 若干1.672で落ち着いているかと思いきや、時々狂っています。 この狂いは何が原因なんでしょうか? しかも狂うときは0.01位、結構ガツンと狂います。 しかもその狂い←●が等間隔で現れるのかと思いきや、そうでもありません。 この一見そろっているようで、時々ガツンと狂うのは何故なんでしょうか?

  • C言語:計算問題を解く時間が計測できません

    C言語を学び始めて1週間程度のものです。 現在柴田望洋著の明解C言語中級編という本でC言語を学んでいます。 その中のプログラミング例を真似してプログラミングしているのですが、 うまく動作しません。詳細は以下の通りです。 著書のList2-6のプログラミングです。 問題:計算問題を解く時間を計測が0.0秒になってしまう。 ここよりプログラミングです。 #include <time.h> #include <stdio.h> #include <stdlib.h> int main (void) { int a, b, c; int x; clock_t start, end; double req_time; srand(time(NULL)); a = 10 + rand() % 90; b = 10 + rand() % 90; c = 10 + rand() % 90; printf("%d + %d + %dは何ですか:", a, b, c); start = clock(); while (1) { scanf("%d", &x); if (x == a + b +c) break; printf("\a違いますよ!!\n再入力してください:"); } end = clock(); req_time = (double)(end - start) / CLOCKS_PER_SEC; printf("%.1f秒かかりました。\n", req_time); if (req_time > 30.0) printf("時間がかかりすぎです。\n"); else if (req_time > 17.0) printf("まあまあですね。\n"); else printf("素早いですね\n"); return (0); } このプログラムを実行して計算を解いて正解の答えを入力しても 0.0秒かかりました。 素早いですね。 としかでてきません。どうすればきちんと時間を計測するプログラミングができるでしょうか。 パソコンはMacbookairを使っています。 コンパイラ(?)はXcodeというものを使っていると思います(ここらへんは勉強不足でよくわかりません。) もしよければご回答お願いします。

  • 素因数分解のプログラムを作成しました。

    素因数分解のプログラムを作成しました。 なぜか11桁を超えた場合、正しく表示されません!! アドバイス等お願いします。 あと、処理時間も組んでみましたがこちらもうまくいきません。 改善をお願いしますm(_ _)m #include<stdio.h> #include<time.h> void fanction(int); void main(void) { int n; clock_t start_time, end_time; printf("整数を入力してください。\n"); scanf("%d",&n); start_time = clock(); fanction(n); end_time = clock(); printf("\n\n処理時間:%.3f秒\n",(double)(end_time - start_time) / CLOCKS_PER_SEC); return 0; } void fanction(int n) { int m; char c='='; for(m=2;n != 1;m++) { while(n%m == 0) { n = n/m; printf("%c%d",c,m); c='*'; } } }

  • それぞれの暗算にかかった時間

    このプログラムは3つの数字の和を暗算させるプログラムです。 プログラムでは、10回の暗算にかかった合計時間を表示させて います。 質問としては「それぞれの回数にかかった時間をそれぞれ 表示させるにはどうすればいいのかか?」です。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int a,b,c,i,n; int num; clock_t start,end; srand(time(NULL)); printf("暗算トレーニング開始!!\n"); start=clock(); for(i=0;i<10;i++) { a=10+rand()%90; b=10+rand()%90; c=10+rand()%90; n=rand()%17; printf("%d%*s+%*s%d%*s+%*s%d:",a,n,"",n,"",b,n,"",n,"",c); do{ scanf("%d",&num); if(num==a+b+c) { break; } printf("\a違います。再入力してください。\n"); }while(1); } end=clock(); printf("%.1f秒かかりました。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • コンパイルエラーです。

    #include <stdio.h> #include <time.h> int main() { float a = 1; float b = 1; clock_t start, end; for(a <= 9999; a++) for(b <= 99999; b++) printf("%fx%f=%f\n",a, b, a*b); end = clock(); printf("[4x4]\n####################\n%fs\n####################\n",(double)(end - start) / CLOCKS_PER_SEC); return 0; } エラーが起きるのですが、僕には、どこが間違っているのかわかりません。 教えてください。

  • クイックソートの処理速度に関する実験 要素1万個、

    クイックソートの処理速度に関する実験 要素1万個、2万個、3万個の配列変数にランダムな値を代入し、・その後クイックソートで小さい順に並べ替える #include<stdio.h> #include<stdlib.h> #include<time.h> #define ASIZE 10000 #define RAND_SEED 0x1131000 void my_sort(int left, int right, int a[]); int main(void){ clock_t start, end; int i,a[ASIZE]; srand(RAND_SEED); for(i=0;i<ASIZE; i++){ a[i]=rand(); } start=clock(); my_sort(0, ASIZE-1, a); end=clock(); printf("%.3f秒でした" ,(end-start)/(double)CLOCKS_PER_SEC); getchar(); return 0; } void my_sort(int left, int right, int a[]){ ここに入れるプログラムがわかりません return; }

  • 秒数を数える(C言語)

    プログラム実行時に時間を数え始めて、100秒経過したらまた最初からプログラムを実行しようと考えています。(tcpdumpみたいなもの) まず、秒数を数えて出力するプログラムを作ってみたのですが、実行しても0.000000と出てしまい、数えることが出来ませんでした。 (例) #include<stdio.h> #include<time.h> void tekitou(); int main() { while(1) { /*無限ループ*/ tekitou(); } return 0; } void tekitou() { static time_t start; time_t last; start = clock(); last = clock(); printf("%f\n", (double)(last - start)/CLOCKS_PER_SEC); } OSはLinuxでコンパイラはgccです。よろしくおねがいします。

専門家に質問してみよう