0

cpp コードを 2 プロファイルしようとしています。-pg フラグを付けてコンパイルし、プロファイルを作成して出力を取得した後、いくつかの非常に奇妙な関数名を取得しました。これは私が使用しているmakeファイルです:

# Makefile for parallel simulated annealer

PREFIX=${PARSECDIR}/pkgs/kernels/canneal/inst/${PARSECPLAT}

TARGET=canneal
LIBS:=$(LIBS) -lm

CXXFLAGS+=-pg

ifdef version
  ifeq "$(version)" "pthreads"
    CXXFLAGS+=-DENABLE_THREADS -pthread
  endif
endif

all:
    $(CXX) $(CXXFLAGS) annealer_thread.cpp -c -o annealer_thread.o
    $(CXX) $(CXXFLAGS) rng.cpp -c -o rng.o
    $(CXX) $(CXXFLAGS) netlist.cpp -c -o netlist.o
    $(CXX) $(CXXFLAGS) main.cpp -c -o main.o
    $(CXX) $(CXXFLAGS) netlist_elem.cpp -c -o netlist_elem.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) *.o $(LIBS) -o $(TARGET)

clean:
    rm -f *.o $(TARGET)

install:
    mkdir -p $(PREFIX)/bin
    cp -f $(TARGET) $(PREFIX)/bin/$(TARGET)

これは、gprof 出力のサンプルです。

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 11.21      0.73     0.73  2800002     0.00     0.00  std::_Rb_tree<std::string, std::pair<std::string const, netlist_elem*>, std::_Select1st<std::pair<std::string const, netlist_elem*> >, std::less<std::string>, std::allocator<std::pair<std::string const, netlist_elem*> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::string const, netlist_elem*> >*, std::_Rb_tree_node<std::pair<std::string const, netlist_elem*> >*, std::string const&)
 10.45      1.41     0.68  5856992     0.00     0.00  atomic_load_acq_int(unsigned int volatile*)
  8.76      1.98     0.57   400001     0.00     0.00  netlist_elem::routing_cost_given_loc(location_t)

これらはファイル内の実際の関数名です。

void annealer_thread::Run()

忘れているフラグはありますか?また、プロファイリングで関数のパラメーターも表示されるのはなぜですか? クラスだからですか?cppだからですか?gprof と c には慣れていますが、cpp との出会いはこれが初めてです

どんな助けでも大歓迎です:)乾杯=)

4

1 に答える 1

1

C ++では、関数名には、それらが属するクラス、それらの戻り型、およびそれらのすべての引数型が含まれます。これは、名前を「マングリング」することによって行われます。これは、関数がさまざまな引数タイプでオーバーロードできるようにするためです。gprofはそれを認識しており、それらを解きほぐすことができます。

フラットプロファイルに表示されているのは、PCがいくつかのクラスライブラリルーチンでキャプチャされることが多いということです。これは、それらのルーチンで終わるコード内の呼び出しパスが何であるかを知る手がかりを与える場合にのみ役立ちます。コールグラフ(計装)はそこで役立つものです。

そしてもちろん、それはあなたがしたくないI/Oを知らない。プログラムは、その時間の99%をライブラリの奥深くでI / Oに費やしている可能性があります。そこでは、それが起こっていることを知らず、どちらも起こっていませんgprof

ズームを見てください。

于 2011-01-25T16:24:24.227 に答える