• ベストアンサー

c言語 時間測定

OrangeCup150の回答

  • ベストアンサー
回答No.3

高分解能タイマは環境依存ですがWindowsであればQueryPerformanceCounter関数とQueryPerformanceFrequency関数が利用できるかもしれません。(普通使えます。) QueryPerformanceCounter関数 http://msdn.microsoft.com/ja-jp/library/cc410966.aspx QueryPerformanceFrequency関数 http://msdn.microsoft.com/ja-jp/library/cc410968.aspx 注意 clock関数と仕様が異なり実時間のタイマです。 補足 clock関数はCPU時間です。詳細は↓ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1338787438 補足 Microsoftのclock関数の実装定義 http://msdn.microsoft.com/ja-jp/library/vstudio/scty34yt.aspx POSIXであればclock_gettime関数とclock_getcpuclockid関数が利用できるかもしれません。 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/clock_gettime.2.html http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/clock_getcpuclockid.3.html

関連するQ&A

  • C言語について。

    プログラムを見ていたらこのような文がありました。これはどのような意味なのでしょうか? clock_t start, finish; この文の前に型宣言みたいなものはありませんでした。では、よろしくお願いします。

  • 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秒になるのはこれのせいだと思うのですが、どうして同じ値になるのでしょうか?

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

  • CGIの表示時間、測定

    Perlを使っています。 CGIの表示時間の測定で、 ********************** $start = (times)[0]; 処理内容 HTML等 $end = (times)[0]; $speed = $end-$start; printf("消費時間: %.5f CPU秒",$speed); ******************* 大体かと思いますが、処理時間の目安としていました。 でも、最近新しいCPUが高いPCを買って、表示速度 が"0.01600 CPU秒" か、"0.00000 CPU秒"にしか、 なりません。 もっと細かく分かる方法はありませんでしょうか?

    • ベストアンサー
    • CGI
  • 秒数を数える(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です。よろしくおねがいします。

  • 流れ図からプログラムに直してください!【C言語】

    その流れ図をC言語のプログラムに直してくれませんか? 処理2はscanf(..);って感じの内容です。 入口 処理1 for(処理2; 判断; 処理4){ 処理3 } 出口 って感じかなって思ったんですが、for文の中にscanfの文を入れてもいいのかわからずに悩んでます。 ループ文なのでwhile文、for文、do..while文のどれかかな?って思ったんですが違う気もして、わかるかたいらっしゃいませんか?

  • C言語でscanfが認識されません

    下記のプログラムですがまずc言語でlevel個の文字列を記憶させます。その後その文字列を0.5秒ほど表示して消し、コンピュータによって指示された番号の文字を当てることを複数回繰り返すプログラムです。 たとえば問題としてABCDEFがでて、その後3が指定されるとCと答えるようにしたいのです。 しかしループの奇数回目の時にscanfが認識がされていない(?)ようで答えを打ち込むことができず勝手に不正解になってしまい自分でプログラムを見直しても間違っている場所が分かりませんでした。 回答よろしくお願いします。 #include<stdio.h> #include<time.h> #include<stdlib.h> #define MAX_STAGE 10 #define MAX_LEVEL 10 #define MIN_LEVEL 3 int sleep(unsigned long x){ /*時間を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); } int main(void){ int stage; int success = 0; int level; clock_t start,end; srand(time(NULL)); printf("いくつかの文字を記憶しましょう\n");/*レベルの設定*/ do{ printf("レベルを%d以上%d以下で入力してください\nLEVEL:",MIN_LEVEL,MAX_LEVEL); scanf("%d",&level); }while(level >MAX_LEVEL || level<MIN_LEVEL); start = clock(); /*本体スタート*/ for(stage = 0;stage < MAX_STAGE;stage++){ char *no; int i,j,k; char alpha[] = "abcdef"; int ans; char kotae; no = calloc(level+1,sizeof(char)); /*答えが含まれる文字列の領域を確保*/ for(i=0;i<level;i++) /*記憶する文字列の作成*/ no[i] = alpha[rand() % 6]; no[i] = '\0'; printf("%s",no); /*答えが含まれる文字列を表示*/ fflush(stdout); sleep(500); ans = rand() % level; /*答える文字を決定*/ printf("\r%d番目の文字を答えよ:",ans + 1); scanf("%c",&kotae); if(no[ans] != kotae) printf("不正解です\n"); else{ printf("正解です\n"); success++; } } end = clock(); printf("%d回中%d回成功しました。\n",MAX_STAGE,success); printf("%.1f秒でした。\n",(double)(end - start) / CLOCKS_PER_SEC); return(0); }

  • c言語でDFTのプログラムを作成したのですが

    c言語でDFTのプログラムを作成しました。 以下にソースを載せます。 #include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> #define PI 3.141592653589793 #define N 64 //データ数 DFT(double result[]){ int i,k; double A[N],B[N],T=0; //A[N]:実数部,B[N]:虚数部 double a,b; for(k=0;k<N;++k){ a=b=0; for(i=0;i<N;++i){ a=a+result[i]*cos(2*PI*i*k/N);      b=b+(-1.0)*result[i]*sin(2*PI*i*k/N); } A[k]=a/N; B[k]=b/N; } for(i=0;i<N;++i){ printf("[%f秒]:Re:%f,Im:%f\n",T,A[i],B[i]); //変換後の値を表示 T=T+(0.1/N); } } main(){ int i; double T=0; double Sampdata; double result[N]; for(i=0;i<N;++i){ Sampdata=5*sin(20*PI*T);      //0~0.1秒間をN個にサンプリング result[i]=Sampdata; //サンプリングデータを代入 T=T+(0.1/N); } clock_t start,end; //処理時間計測開始 start=clock(); DFT(result); end=clock(); printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); //処理時間表示 } 元信号には5sin(20πt)の値を入れています。この信号は周期は0.1secです。 これでフーリエ変換を行うとデータ数N/2を中心に対称なデータが出てくるのですが、処理が終わるのが早い気がするんです。 例えば2^15個のデータで実行しても2分もかからずに処理が終わってしまいます。一応、対称性が出てるとはいえ、終わるのが早すぎる気がするのですが、おかしい所があれば教えていただけると嬉しいです。 よろしくお願いします。

  • c言語 プログラム

    c言語の時間計測を調べていたら下記のようなプログラムを見つけました。 プログラムを読んでて疑問があったので質問します。 質問は2つあります for文のところに x = (double)k/loop が入っているのですがどのような意味なのでしょうか? また*1.e6の値はいくらなのでしょうか? サンプルプログラム #include<stdio.h> #include<time.h> #include<math.h> int main(){ clock_t stt,mid,end;//_測定時刻 double secs;//_経過秒数 double msec;//_マイクロ秒 int k,loop=10000000;//_測定増幅ループ double x;//_対象関数の引数 int clksec=CLOCKS_PER_SEC; char *ttl="elapse_for_exp(x)"; int n,m=7;//_観測ループ double sm,ss;//_合計、平方和 double mean;//_平均値 double stdv;//_標準偏差 sm=ss=0; for(n=0;n<m;n++){ stt= clock();//_測定開始 for(k=0;k<loop;k++){ x = (double)k/loop; } mid = clock();//_中間測定 for(k=0;k<loop;k++){ x=(double)k/loop; exp(x);//_時間測定対象の関数 } end=clock();//_測定終了 secs=(double)((end-mid)-(mid-stt))/clksec; msec=secs/loop*1.e6; printf("%s = %fmicrosec.\n",ttl,msec); sm += msec; ss += msec*msec; } printf("合計____%f\n",sm); printf("平方和__%f\n",ss); mean = sm/m; stdv=sqrt(ss/m-mean*mean); printf("平均値___=_%f\n",mean); printf("標準偏差_=_%f\n",stdv); return 0; }

  • CPU時間の測定

    任意のJavaアプリケーション内の特定の処理での実行時に消費したCPU時間を,そのJavaアプリケーション内部で測定するにはどのようにしたらよいのでしょうか(開始時と終了時の currentTimeMillis() の差分は実時間なので該当せず.アプリケーション起動時にシェルでtimeコマンドを呼ぶのも,外部からの測定であり,また,アプリケーション全体の測定になるので該当せず).C/C++ では clock() の差分で測定していたのですが Javaでの方法がわかりません.OSはLinuxです.

    • ベストアンサー
    • Java