- 締切済み
プロセス実行速度の計測
C言語でプロセスの実行速度の計測方法・ソース等、教えてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
他の回答の通り、時計はgettimeofday()で良いでしょう。 但し「プロセスの実行1回のみ」ではダメです。 正確に計測するには、以下のようにします。 1.時計を取得する。 2.forループ等で、下記3を10000回ループをする。 3.計測対象の処理。 4.時計を取得する。 5.forループ等で、何もしないループを10000回ループする。 6.時計を取得する。 7.上記1の時計と4の時計の時差を求める。 8.上記4の時計と6の時計の時差を求める。 9.上記7で求めた時差から、8で求めた時差を引く。すると「forループで10000回ループする際の処理時間」が計測値から除外される。 10.上記9で求めた計測値を10000で割ったのが、1回の実行時間。 (注)5の空ループが最適化されないよう「コンパイラオプションで、最適化なし」にしておく事。 5~9で色々な処理をしているのは「ループ文を処理する時間を計測値から除く為」です。 例えば、1の時計と4の時計の時差が12.1秒、4の時計と6の時計の時差が0.1秒なら、ループ文を処理する時間を除いた「計測対象のみの10000回の実行時間」は「12.1-0.1=12秒」です。これを10000で割れば「1回の実行時間」が出ます。 時計が1000分の1秒の精度で正確なのであれば、精度は100000分の1秒くらいにはなるかも。 ともかく「1回の実行時間では不正確」なので、1000回以上は繰り返して実行して、その時間を計った方が良いでしょう。
- D-Matsu
- ベストアンサー率45% (1080/2394)
基本的に#3で言われている通りgettimeofday()でいいかと思いますが、一応こんな話もあります。 http://www2.nict.go.jp/w/w114/tsp/research/labo3/gettime.html まぁ極端に細かい単位で取らない限りはそう問題にはならないはずですが。
お礼
お礼が遅くなりすみません・・・ 参考になるページでした。 ありがとうございました!
- zwi
- ベストアンサー率56% (730/1282)
組み込み系のLinuxで無ければ、確かgettimeofday()で十分な精度が得られるはずです。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/gettimeofday.2.html こんな感じですかね。計測対象は、かなり適当な処理が書いてあります。 #include <sys/time.h> #include <stdio.h> double gettimeofday_msec() { struct timeval tv; gettimeofday(&tv, NULL); return (double)tv.tv_sec*1000.0 + (double)tv.tv_usec/1000.0; } int main() { double t1,t2; /*開始時間取得*/ t1 = gettimeofday_msec(); /*計測対象*/ char str[16]; int i; for (i = 0; i < 100000; i++) { sprintf(str,"%d",i); } /*終了時間取得*/ t2 = gettimeofday_msec(); /*差分から処理時間を求める。*/ printf("処理時間:%.1fms\n", t2 - t1); } このコードは、cygwinでしか動作確認してません。
お礼
お礼が遅くなりすみません。。 ありがとうございました。 処理時間の計測ができました!本当助かります。
- zwi
- ベストアンサー率56% (730/1282)
gccでWindowsですか。 そうすると仮想マシンとかじゃなくてcygwinかMinGWでしょうか? クロス・コンパイルで実行時はマイコンがターゲットじゃないですよね?出来上がったプログラムはWindows上で実行と考えて良いですか? そこだけハッキリさえてもらえますか。
補足
すみません。間違えていました。。。 OSはLinuxです。 コンパイラはgccです。 プログラムの実行もLinux上です。 たびたびすみませんが、 よろしくお願いいたします。
- zwi
- ベストアンサー率56% (730/1282)
補足をお願いします。ハード、OS、C言語のコンパイラの名称。 それと ・プロセスの実行速度ってのはタイマとしての実行時間の計測ですか?それとも実際に利用したCPUタイム? ・それと時間の単位は秒?ミリ秒?マイクロ秒? などなど欲しい情報が分りませんので補足をお願いします。
補足
ハードは職場に行ってみないと分かりません。。。 OSはWindowsでコンパイラはgccを使用しています。 プロセスの実行速度はタイマとしての実行時間の計測です。 時間の単位はミリ秒でお願いします。 多々、知識不足のため、質問が漠然とし過ぎているかもしれませんが、 よろしくお願いします。
補足
返信がおそくなりすみません。 質問なのですが、 >5の空ループが最適化されないよう「コンパイラオプションで、最適化なし」にしておく事。 最適化されるとどうなるのですか? また、空ループを普通にコンパイルすると、 デフォルトで最適化されるということですか? (コンパイラによるということですかね・・・?)