7

いくつかの .h および .c ファイルと多くの関数で構成されるプログラムがあります。また、他の関数を呼び出す関数などがあります。さて、これは実際には課題なので、プログラムが終了するまでにどれくらいの時間が必要かがわかります。

問題は、与えられた時間に比べて私のプログラムに時間がかかりすぎることです。どの関数に時間がかかりすぎているのか、またはコードのどの部分がプログラムを停止させているのかを突き止めることはできますか?


コードが長すぎるため、ここでは提供しませんでした。「私のプログラム」が遅い理由を誰も答えられないことは知っていますが、私は一般的に話しています! 各機能にかかる時間を測定するツールなどはありますか? 私はgccを使用しており、Linuxを使用しています。

4

2 に答える 2

9

Linux を使用しているため、gprofプロファイラーは既にインストールされている可能性があります。の最も基本的な使用法は、オプションを使用gprofしてコンパイルすることです-pg(この-gオプションは、有益な出力を得るためにも必要です)。例えば

> gcc -g -pg -o my_executable my_file.c

これで、プログラムを通常どおり実行できます。それからあなたは走ります

> gprof my_executable > profile.txt

これにより、プロファイリング情報が に出力されprofile.txtます。このデータは少し似ています

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 33.34      0.02     0.02     7208     0.00     0.00  open
 16.67      0.03     0.01      244     0.04     0.12  offtime
 16.67      0.04     0.01        8     1.25     1.25  memccpy
 16.67      0.05     0.01        7     1.43     1.43  write
 16.67      0.06     0.01                             mcount
  0.00      0.06     0.00      236     0.00     0.00  tzset
  0.00      0.06     0.00      192     0.00     0.00  tolower
  0.00      0.06     0.00       47     0.00     0.00  strlen
  0.00      0.06     0.00       45     0.00     0.00  strchr
  0.00      0.06     0.00        1     0.00    50.00  main
  0.00      0.06     0.00        1     0.00     0.00  memcpy
  0.00      0.06     0.00        1     0.00    10.11  print
  0.00      0.06     0.00        1     0.00     0.00  profil
  0.00      0.06     0.00        1     0.00    50.00  report

[...]

また、各関数に関するいくつかのデータを読み取ることができます (たとえばopen、7208 回呼び出され、実行に 0.02 秒が費やされました)。この例のデータは、このガイドから借用したものです。このガイドには、より多くの説明があり、プロファイリングを操作して行ごとのプロファイリングなどを取得する方法が説明されているため、読む必要があります。

于 2012-06-08T05:10:11.067 に答える
1

上記の dbaupp が示唆しているように、gprof は Linux 用の優れたツールです。それに加えて、IBM Rational Quantifyにアクセスできる場合は、それも試すことができます。これは商用ツールですが、時間がかかる機能やコール フローなどをグラフィカルに表示できます。

于 2012-06-08T05:13:50.407 に答える