プログラム実行時間計測方法について

このQ&Aのポイント
  • プログラム実行時間計測方法について質問します。パケットが受信される度にmessage関数が呼び出され、処理をしていますが、実行時間の計測方法はありますか?
  • clock関数のclock_t型を用いてプログラムの実行時間を計測したいと思っていますが、問題があります。パケットが受信されるたびにmessage関数が呼び出され、かつパケットが受信される度に開始時間がリセットされてしまうのです。
  • 実行時間の計測方法について、対策方法を教えてください。
回答を見る
  • ベストアンサー

プログラムの実行時間計測方法について

プログラムの実行時間の計測方法について、質問します。 以下に示すプログラムは、パケットが受信される度にmessage関数が呼び出され、message関数内で受信したパケットをfwrite関数を用いて処理をしています。 [質問内容] clock関数のclock_t型を用いて、プログラムの実行時間を計測したいと思っています。しかし、以下に示すプログラムの場合、パケットが受信されるたびにmessage関数が呼び出され、かつパケットが受信される度にstart = clock()で0秒からの開始になってしまいます。 なにか、対策方法はあるのでしょうか? よろしくお願いします。 [プログラム] void main(int argc, char** argv){ //パケットが受信される度にmessage関数が呼ばれる。 message(); } void message(){ double time; clock_t start,finish; if(equals(msg->selector,(byte*)"test",strlen("test"))){ start = clock(); fwrite(msg->payload,msg->payload_length,1,fp); finish = clock(); time = (double)(finish - start)/1000.0; printf("データ送信時間:%f[sec]\n",time); } else if(equals(msg->selector,(byte*)"finish",strlen("finish"))){ done = D_TRUE; } }

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

正直何をしたいのかよく分からないんだが・・・・。 とりあえずいっぱいメッセージを受信して、毎回fpに書き込んでいるその差の時間を取っている事は分かる。 つまり、5回受信したらその5回のfwrite時間を合計したいって事かな? であれば、モジュール(cソースファイル)内に1個変数を作るかstatic変数を作るかで、累積時間を足しこんで行くかして、過去の実績を保存しておく方法が考えられる。 void message(){ double time; clock_t start,finish; static double total = 0; /* static変数を作る */ if(equals(msg->selector,(byte*)"test",strlen("test"))){ start = clock(); fwrite(msg->payload,msg->payload_length,1,fp); finish = clock(); time = (double)(finish - start)/1000.0; printf("データ送信時間:%f[sec]\n",time); /* ひょっとして累計をこっちに出したいのかな? */ total += time; /* 累計に足しこむ */ } else if(equals(msg->selector,(byte*)"finish",strlen("finish"))){ done = D_TRUE; }

bird_2005
質問者

補足

書き込みありがとうございます。 質問の仕方があやふやで、申し訳ありません。 自分が作成したプログラムは、送信側からパケットが来るたびに、受信側のmessage関数が呼び出され、message関数内のfwriteでファイルに書き込んでいます。 今回質問させていただいた内容としまして、受信側の受信開始から終了までの時間(fwriteへの書き込み開始から書き込みが終了するまでの時間)を知りたいと思っています。 しかし、送信側からパケットが来るたびにmessage関数が呼び出されるため、start=clcok()が毎回呼び出されてしまう=0秒のまま、という状態に陥っています。 >printf("データ受信時間:%f[sec]\n",time); /* ひょっとして累計をこっちに出したいのかな? */ はい、そのようにしたいと思っています。 よろしくお願いします。

関連するQ&A

  • このプログラムの結果は正しいのでしょうか?

    下記のプログラムはregister変数へのアクセスが高速であることを確認するためのプログラムです #include <stdio.h> #include <time.h> int i; /* これはグローバル変数なので、 register変数には変換されない */ int main(void) { register int j; int k; clock_t start, finish; start = clock(); for(k=0; k<100; k++) for(i=0; i<32000; i++); finish = clock(); printf("レジスタを使わないループの刻み数: %ld \n", finish - start); start = clock(); for(k=0; k<100; k++) for(j=0; j<32000; j++); finish = clock(); printf("レジスタを使ったループの刻み数: %ld \n", finish - start); return 0; } 【質問】 このプログラムを実行すると、 レジスタを使わないループの刻み数: 15 レジスタを使ったループの刻み数: 0 と表示されます。 この結果はregister変数へのアクセスが高速であることの証明になるのでしょうか? また「刻み数」とは何のことですか?教えて頂けないでしょうか?

  • プログラムの実行を中断

    標準ライブラリにプログラムを指定した時間だけ停止する、というような関数はあるでしょうか? 自分でも似たような関数を作ったのですが、負荷が大きいらしく動作が指定した時間よりも遅れてしまうことがあります。 #include <ctime> void sleep(int time) { tm *present; time_t clock; int begin; time(&clock); present=localtime(&clock); begin=present->tm_sec while(begin!=present->tm_sec-time){ time(&clock); present=localtime(&clock); } return; }

  • 特定文字カウント機能について

    送信側から受信側にパケットを送信するプログラムを作りました。 受信側では、送信側から送信されたパケットは、data関数内で処理されるようにしました。 そこで、「send」文字を付加したパケットだけカウントするようにしたいのですが、どのように記述すればよいか教えていただけないでしょうか? void main(){ data(); } void data_packet(){ int d=0; if(equals(message,(send*)"test",strlen("send"))){ d++; } printf("カウント数:%d\n",d); } 上記に示したプログラムの場合、data関数が呼ばれるたびに、int d=0より、0へと戻ってしまいます。なにか方法はありますでしょうか? よろしくお願いします。

  • 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言語について。

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

  • windowsプログラムのヘッダーについて

    SDKを用いてWindowsプログラムを作っています。 #include <ctime> とインクルードした上でclock()関数を使用したのですが、コンパイラから未定義の関数を呼び出したことになってエラーが出てしまいます。他のヘッダーも含めC++の標準ライブラリはインクルードできないのでしょうか? ちなみに、<time.h>でインクルードすればコンパイルできます。

  • 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='*'; } } }

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

  • freadでファイルを読み込んだ際の処理時間について

    フラッシュメモリやハードディスクへファイルの書き出しをfwriteで行い、 作成したファイルをfreadを使って読み込み、その前後でclock関数を呼ぶことで 読み書きの処理時間を算出するプログラムを作成しています。 具体的には以下のような処理を行わせています。 //書き込み用のバッファを作成 buf_w = (unsigned char*)malloc(BUFSIZE); memset(buf,0,BUFSIZE); //ファイル書き込み処理 fp = fopen("ファイル名","wb"); start = clock(); fwrite(buf_w,BUFSIZE,1,fp); end = clock(); fclose(fp); //読み出し用のバッファを作成 buf_r = (unsigned char*)malloc(BUFSIZE); //ファイル読み出し処理 fp = fopen("ファイル名","rb"); start = clock(); fread(buf,BUFSIZE,1,fp); end = clock(); fclose(fp); 以上の処理にて、BUFSIZEが1GB程度の場合は問題ないのですが、 BUFSIZEを200MB程度に減らした場合に読み込み速度が ありえないほど速くなってしまうという問題が発生してしまいます。 (HDDやフラッシュメモリからの読み込みなのに転送速度が1000MB/sオーバーとか) RAMDISKとして設置したXドライブで試すと読み書き共に1200MB/sくらいになるので、 もしかしたらメモリにキャッシュされたデータを直接読み込んでしまっているのでは…… などと考えているのですが、試行錯誤すれども回避策が思い浮かびません。 どなたか、この現象について心当たりのある方がいらっしゃいましたら何かアドバイスいただけると幸いです。 宜しくお願いいたします。

専門家に質問してみよう