- ベストアンサー
gccのプロファイラで時間が取得できない
- gccのプロファイラを使ってプログラムの実行時間を計測しようとしたが、時間に関する情報が取得できない問題に遭遇しました。
- 関数別の呼び出し回数などは取得できるものの、timeなどのパラメータがすべて0.0と表示されています。
- いくつかのサイトを参考に試してみましたが解決策が見つかりません。何かご存知の方がいらっしゃれば助けていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
gprof を2.18.50にバージョンアップしてみたところ、 同様に実行時間が取得出来ない現象が確認出来ました。 http://ftp.jaist.ac.jp/pub/cygwin/release/binutils/binutils-20060817-1.tar.bz2 より「GNU gprof 2.17.50」をダウンロードできるみたいなので、 こちらも試してみてください。 拙者の予想だと、gmon.outの書式に使用変更があり、gprofは対応済みだったのに、 gccがまだ古い仕様で動いていたとか言う落ちじゃないだろうか・・・
その他の回答 (3)
- Yanch
- ベストアンサー率50% (114/225)
当方の環境でも、gprofを試してみました。 実行結果 ---------------------------------------------------------------------- Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 100.00 84.46 84.46 1000 0.08 0.08 hogehoge 0.00 84.46 0.00 1 0.00 84.46 hogehoge_test ---------------------------------------------------------------------- と、実行時間は問題なく、取得できましたよ。 プログラムを変更して、ビルドしなおした時は、 「gmon.out」を再作成する必要があるみたいです。 gmon.outの再作成はしていますか? 確認環境: Microsoft Windows 2000 Pro cygwin+gcc gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) GNU gprof 2.17.50 確認したプログラム ---------------------------------------------------------------------- #include <stdio.h> void hogehoge(); void hogehoge_test(); int main(int argc, char *argv[]) { hogehoge_test(); return 0; } void hogehoge() { int i = 0; int j = 0; int isSosuu = 0; for (i = 1; i < 10000; i++) { isSosuu = 0; if (i == 1 || i == 2) { isSosuu = 1; } else if (i % 2){ isSosuu = 1; for (j = 3; j <i; j += 2) { if (!(i % j)) { isSosuu = 0; break; } } } if (isSosuu) { printf("%d ", i); } } } void hogehoge_test() { int i = 0; for (i = 0; i < 1000; i++) { hogehoge(); } } ----------------------------------------------------------------------
お礼
試していただきありがとうございます。 >gmon.outの再作成はしていますか? 毎回作り直しています。いったん消してやってみましたが同様に時間が取得できませんでした。 実際に貼って頂いたコードで実行してみましたが、うまくいきませんでした。 実行手順としては以下の流れで行っています。 1. gcc -pg test.c 2. ./a.exe 3. gprof ./a.exe gmon.out 以下が結果です。 ---------------------------------------------------------------------- 確認環境: Microsoft Windows Vista Home Basic cygwin+gcc gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) GNU gprof 2.18.50 実行結果 ---------------------------------------------------------------------- Flat profile: Each sample counts as 0.01 seconds. no time accumulated % cumulative self self total time seconds seconds calls Ts/call Ts/call name 0.00 0.00 0.00 1000 0.00 0.00 hogehoge 0.00 0.00 0.00 1 0.00 0.00 hogehoge_test ----------------------------------------------------------------------
- Yanch
- ベストアンサー率50% (114/225)
情報が少ないので、確かな事は言えませんが、 ●コンパイルオプションは何を指定していますか? ●実行時間は目測で何秒位でしょう? gprofは実行時間の大きい関数を最適化するために役に立つかもしれませんが、 実行時間が短い関数だと、timeは計測出来ないかもしれません。
補足
オプションは-pgです。 実行時間は、上で出力結果のサンプルで示したものだと目測で8秒前後です。 1分前後のプログラムでも試してみましたが、同様にtimeが0.0でした。
- Werner
- ベストアンサー率53% (395/735)
あなたが提示した一つ目の参考サイトに | - Cygwin 環境でも gprof は利用できるが、プロファイル結果に一部不具合がある。 | -- 関数呼び出し回数は正しくカウントできるが、経過時間の値が正しくない。 | -- Linux 環境ではミリ秒単位での測定できるが、Cygwin では秒単位での測定しかできないため、誤差が大きい。 って書いてあるから、 cygwin上のgprofは時間を計るには使い物にならないんじゃない?
お礼
GNU gprof 2.17.50をダウンロードしてみましたが環境の違いか、残念ながらgcc自体ができなくなって試せませんでした。 >gprof を2.18.50にバージョンアップしてみたところ、 >同様に実行時間が取得出来ない現象が確認出来ました。 そうですか、gprofの利用は無理そうなので他の手段を探してみたいと思います。 色々と試していただきありがとうございました。 とても勉強になりました。