電子書籍の厳選無料作品が豊富!

C言語でプロセスの実行速度の計測方法・ソース等、教えてください。

A 回答 (5件)

他の回答の通り、時計は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回以上は繰り返して実行して、その時間を計った方が良いでしょう。

この回答への補足

返信がおそくなりすみません。
質問なのですが、
>5の空ループが最適化されないよう「コンパイラオプションで、最適化なし」にしておく事。

最適化されるとどうなるのですか?
また、空ループを普通にコンパイルすると、
デフォルトで最適化されるということですか?
(コンパイラによるということですかね・・・?)

補足日時:2009/02/08 10:22
    • good
    • 0

基本的に#3で言われている通りgettimeofday()でいいかと思いますが、一応こんな話もあります。


http://www2.nict.go.jp/w/w114/tsp/research/labo3 …
まぁ極端に細かい単位で取らない限りはそう問題にはならないはずですが。
    • good
    • 0
この回答へのお礼

お礼が遅くなりすみません・・・
参考になるページでした。
ありがとうございました!

お礼日時:2009/02/08 10:21

組み込み系のLinuxで無ければ、確かgettimeofday()で十分な精度が得られるはずです。


http://www.linux.or.jp/JM/html/LDP_man-pages/man …

こんな感じですかね。計測対象は、かなり適当な処理が書いてあります。
#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でしか動作確認してません。
    • good
    • 0
この回答へのお礼

お礼が遅くなりすみません。。
ありがとうございました。
処理時間の計測ができました!本当助かります。

お礼日時:2009/02/08 10:20

gccでWindowsですか。


そうすると仮想マシンとかじゃなくてcygwinかMinGWでしょうか?
クロス・コンパイルで実行時はマイコンがターゲットじゃないですよね?出来上がったプログラムはWindows上で実行と考えて良いですか?
そこだけハッキリさえてもらえますか。

この回答への補足

すみません。間違えていました。。。
OSはLinuxです。
コンパイラはgccです。
プログラムの実行もLinux上です。
たびたびすみませんが、
よろしくお願いいたします。

補足日時:2009/02/01 17:42
    • good
    • 0

補足をお願いします。

ハード、OS、C言語のコンパイラの名称。
それと
・プロセスの実行速度ってのはタイマとしての実行時間の計測ですか?それとも実際に利用したCPUタイム?
・それと時間の単位は秒?ミリ秒?マイクロ秒?
などなど欲しい情報が分りませんので補足をお願いします。

この回答への補足

ハードは職場に行ってみないと分かりません。。。
OSはWindowsでコンパイラはgccを使用しています。
プロセスの実行速度はタイマとしての実行時間の計測です。
時間の単位はミリ秒でお願いします。
多々、知識不足のため、質問が漠然とし過ぎているかもしれませんが、
よろしくお願いします。

補足日時:2009/02/01 16:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!