• ベストアンサー

計算処理時間を出力したい!

素因数分解を行うプログラムにおいて、処理時間を計算する必要があります。 #include <stdio.h> #include <time.h> main() unsigned long i,t0,t1; t0 = clock(); for(i=0; i<100000; i++){ } t1 = clock(); printf("Time : %lf\n", t1 - t0); } などと例を作ってテストしているのですが、小さな単位まで出てきません。 100分の1秒単位で出てきているとおもいます。 もっと細かい時間を計測するのにはどうしたらいいのでしょうか?

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.5

clock()は標準関数なので、ちょっと調べれば正しい使い方がすぐわかると思いますが・・・ まずclockの戻値はtime.h内で定義されている、clock_t型で受け取るようにしましょう。 あなたの環境ではたまたまunsigned longで実装されているのかもしれませんが、他の環境やバージョンでもそうだとは限りませんよ? それからprintfの中ですが、unsigned long同士の引き算の結果はunsigned longになりますので、double型を期待する%lfでは正しく表示されません。 (正しく表示するには%luを使うか、(double)t1-t0としてキャストする。) clock関数は1秒より小さい単位で時間を計測しますが、それは小数型で計測しているのではなく、秒より小さい単位を使って整数型で計測しています。(つまり単位は秒ではありません。) これを秒単位に直すには、time.h内で定義されているCLK_TCKマクロを使います。 ではでは、下のサンプルを参考にしてみてください。 #include <stdio.h> #include <time.h> void main() {   clock_t t0, t1;   int i;   t0 = clock();   for (i = 0; i < 100000; i++) {     /* 重い処理。バブルソートなんかいいかもね */   }   t1 = clock();   printf("Time:%f\n", (t1-t0) / CLK_TCK);   /* そういやdoubleは%fでした。long doubleは%Lfだし…。%lfって何!? */ }

ichiro29
質問者

お礼

ありがとうございました。 無事解決することができました。

その他の回答 (4)

  • madman
  • ベストアンサー率24% (612/2465)
回答No.4

unixであればgettimeofdayで秒とマイクロ秒が取得できます。 struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; です。 加工すれば、目的となる数値が計算できるでしょう。 forのループは中で何か計算しないと最適化されて無くなるおそればあります。 また、unsigned longの値をdouble型で出力するのもどうかと思われます。 #include <sys/time.h> #include <unistd.h> main(){ struct timeval tm; struct timezone tz; gettimeofday(&tm, &tz); } windows系だと解りません。

ichiro29
質問者

お礼

ありがとうございました。 無事解決いたしました…。

  • bagyo
  • ベストアンサー率40% (16/40)
回答No.3

こんにちわ。 これは、プログラミングをしている環境(OS)によって違ってくるのではないでしょうか? 例えば、FreeBSD(UNIX系?)ではgetrusageというシステムコールがあり、これを利用することで計測することができます。 あとは、複数回の計測を行い、上下のデータを外した平均を取るという方法もあったはずです。少なくとも1回の計測では、キャッシュの影響などが大きく出すぎるのではないかと思います。

ichiro29
質問者

お礼

ありがとうございました。 無事解決することができました…

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.2

WindowsのAPIでQueryPerformanceFrequencyとQueryPerformanceCounterを使えば、CPUにもよりますが、高分解能で出てきます。 また、Windowsでない場合、同一処理を数千回~数万回の単位繰り返し処理させ、その時に掛かった処理時間/実行回数の平均を取ると大体の1回辺りの処理速度が計算できます。

ichiro29
質問者

お礼

ありがとうございました。 無事解決いたしました…。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

質問での例だと最適化されてfor分自体が無くなってしまう可能性がありますね。 もう少し何かをやらせるようにしないと例として成り立ちません。

ichiro29
質問者

お礼

ありがとうございました。 無事解決いたしました…。

関連するQ&A

  • なんで一瞬で処理が終わるの?

    時間を計測するプログラムを書いたのですが、何故か一瞬で処理が終わってしまいます。 #include <stdio.h> #include <time.h> int main(void){ int i,j,a,b=1; clock_t t; t=clock(); for(i=0;i<1000000000;i++){ for(j=0;j<10000000;j++){ a=b; } } printf("%.3f秒\n",(clock()-t)/1000.0); printf("%f %f",clock(),t); return 0; } 実行結果 0.000秒 0.000000 0.000000 なんで0なんでしょうか・・。

  • time()関数について

    このたび、一定処理にかかる時間を調べるために、 次のようなプログラムを作成しました。 #include <stdio.h> #include <time.h> int main(void) { int i; long time; time_t t1, t2; time(&t1); for (i = 1; i <= 5000; i++) { printf("%d, ", i); } time(&t2); printf("\nTime1 = %lf\tTime2 = %lf\n", t1, t2); time = t2 - t1; printf("かかった時間:%lf\n", time); return 0; } 1-5000まで、数字を表示するために、 こういうプログラムを作ったのですが、 どうもtime()関数のところでエラーが出ます。 関数でないものを呼び出している(関数 main ) とでます。time.hをインクルードしてあるのですが、 何が原因なのか分かりません。 コンパイラはBCC5.5を使っています。 ご教授願います。

  • 乱数について

    Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。

  • ソートの時間計算について

    ソートの時間計測について以下のようなプログラムを作成したのですが、ソートはうまく動きますが何度試しても処理時間が0.00000秒となってしまいます。どのように改良すればこのような問題を解決できるのでしょうか。ご回答よろしくお願いいたします。 #include <stdio.h> #include <time.h> #define SIZE 100 void swap(int data[], int s, int t){ int tmp = data[s]; data[s] = data[t]; data[t] = tmp; } void Bsort(int data[], int size) { int i, j; for(i=1; i<size; i++){ for(j=(size-1); j>0; j--){ if(data[j] < data[j-1]){ swap(data, j, j-1); } } } } void Ssort(int data[], int size){ int i, j, k, tmp; for(i=1; i<size; i++){ k = data[i-1]; for(j=i; j<size; j++){ if(k>data[j]){ tmp = k; k = data[j]; data[j] = tmp; } } tmp = k; k = data[i-1]; data[i-1] = tmp; } } void printArray(int ar[], int size) { int i; for (i = 0; i < size; i++) printf("%4d", ar[i]); printf("\n"); } int main(void) { int i, x; int data[SIZE]= {412, 54, 595, 329, 24, 488, 313, 272, 129, 210, 670, 516, 342, 541, 491, 640, 167, 117, 726, 206, 474, 762, 153, 292, 1000, 607, 151, 661, 93, 270, 737, 531, 641, 548, 299, 287, 547, 394, 550, 475, 443, 261, 707, 503, 403, 739, 226, 646, 778, 588, 427, 169, 477, 572, 413, 300, 88, 321, 55, 779, 542, 680, 211, 273, 288, 276, 405, 307, 424, 668, 756, 255, 190, 449, 35, 435, 91, 486, 58, 408, 4, 63, 534, 330, 701, 65, 256, 311, 586, 404, 459, 254, 291, 333, 42, 343, 418, 512, 164, 56}; clock_t t1,t2; printf("番号を入力してください。\n1,Bubble Sort\n2,Selection Sort\n"); scanf("%d", &x); switch(x){ case 1: printf("before:"); printArray(data, SIZE); t1 = clock(); Bsort(data, SIZE); t2 = clock(); printf(" after:"); printArray(data, SIZE); printf("処理時間:%f[ms]¥n", (double)(t2 - t1) / CLOCKS_PER_SEC); break; case 2: printf("before:"); printArray(data, SIZE); t1 = clock(); Ssort(data, SIZE); t2 = clock(); printf(" after:"); printArray(data, SIZE); printf("処理時間:%f[ms]¥n", (double)(t2 - t1) / CLOCKS_PER_SEC); break; } return 0; }

  • 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というものを使っていると思います(ここらへんは勉強不足でよくわかりません。) もしよければご回答お願いします。

  • 乱数

    #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { double n,end; printf("いくつ以上の値が出たら終了しますか?:"); scanf("%lf",&end); srand((unsigned)time(NULL)); for( ; ; ){ n=(double)rand(); printf("%f\n",n); if(n>=end) break; } return 0; } これなんですが、このまま実行すると.00000になってしまいます。 自分的には0.~にしたいのですが、どう変えればいいでしょうか? 回答お願いします。

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

    このプログラムは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; }

  • 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位、結構ガツンと狂います。 しかもその狂い←●が等間隔で現れるのかと思いきや、そうでもありません。 この一見そろっているようで、時々ガツンと狂うのは何故なんでしょうか?

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

    素因数分解のプログラムを作成しました。 なぜか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='*'; } } }

  • C言語についてなのですが、

    C言語についてなのですが、 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<search.h> int main(void) { int i,j,k,temp,n,count,time,list[65537]; clock_t startTime, endTime; printf("取得する乱数の個数を入力してください\n"); scanf("%d",&n); srand((unsigned)time(NULL)); printf("Before sort\n"); startTime = clock(); for(i = 0; i < n; i++) { list[i] = rand(); /* printf("%d\n", list[i]);*/ } count = 0; for (i = 1; i < n; i++) { for (j = i; j < n-i-1; j++) { count++; if(list[j] < list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } endTime = clock(); printf("\nAfter sort\n"); for(k = 0; k < n; k++) { /* printf("%d\n", list[k]);*/ } printf("\n比較回数:%d\n", count); printf("実行時間:%.4f秒\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); return 0; } 上記のソースコードをcygwinで gcc -Wall -o k5-1-2 k5-1-2.c でコンパイルしようとすると k5-1-2.c:関数'main'内 k5-1-2.c:14:error:called object is not a function と表示されます。 いろいろなサイトを参考にして乱数取得用に srand((unsigned)time(NULL));を使うように書かれていたので使っているのですが、何かだめなのでしょうか?自分ではお手上げ状態で。