9

私たちは g++ 4.2.4 を使用しており、コード内のいくつかのパフォーマンスの問題を突き止めようとしています。

プロファイルを生成するために gprof を実行していますが、最も高価な関数が __tcf_0 であるという点で、次のような「奇妙さ」を感じています。

Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
40.00      0.04     0.04        1    40.00    95.00  __tcf_0

この関数は、ほとんどのユーザー関数を呼び出すように見えます (つまり、メインから呼び出される関数です)。これについて私が見つけた最も近い説明はhereでしたが、そのリンクは静的オブジェクトと atexit を参照しており、これは私の場合には当てはまらないと思います。

参考になれば、Boost (program_options と fusion) と HDF5 ライブラリを使用しています。

アップデート:

ビルド時に使用するコマンドは次のとおりです。

g++  -Wreturn-type -Wunused -Winline -pg  -DLINUX -DHAS_SETENV \
    -DFUSION_MAX_MAP_SIZE=15 -DFUSION_MAX_VECTOR_SIZE=15  -g -O0 \
    --param large-function-growth=300 --param inline-unit-growth=200
4

2 に答える 2

6

__tcf_0 は確かに、静的オブジェクトのデストラクタを呼び出し、静的オブジェクトごとに登録され、終了時に呼び出される関数のようです (このページで述べられていることを当然のことと考えてください) 。

さて、gprof の結果は非常に奇妙です。ほとんどの時間かかる関数は 0.04 秒しかかからないため、プログラム全体の実行に 0.1 秒かかることを意味します。私が間違っていなければ、あなたは正しくプロファイリングしていなかったと思います。プロファイリングを有効にしてコードをコンパイルしましたか?

于 2009-08-04T12:38:36.817 に答える
6

g++ は、この名前の関数を生成します。それらは静的オブジェクトのデストラクタを呼び出し、コンストラクタが呼び出されたときに atexit() に登録されます。

于 2009-08-04T12:39:37.267 に答える