Gprof портит - PullRequest
       20

Gprof портит

0 голосов
/ 25 января 2011

Я пытаюсь 2 профиля код cpp. Я скомпилировал с флагами -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

Любая помощь приветствуется :) ура =)

1 Ответ

1 голос
/ 25 января 2011

В C ++ имена функций включают в себя класс, к которому они принадлежат, их тип возвращаемого значения и все типы их аргументов.Это делается путем "искажения" имен.Это так, что функции могут быть перегружены различными типами аргументов.gprof знает об этом и может их исправить.

То, что вы видите в плоском профиле, это то, что ПК часто захватывается в некоторых подпрограммах библиотеки классов.Это полезно только в том случае, если оно дает вам представление о том, каковы пути вызова в вашем коде, которые заканчиваются этими подпрограммами.Граф вызовов (инструментарий) - некоторая помощь там.

И, конечно, он слеп к любому вводу / выводу, который вы бы предпочли не делать.Программа могла бы тратить 99% своего времени на глубокие операции ввода-вывода в библиотеке, где вы не знаете, что это происходит, и при этом gprof.

Взгляните на Zoom .

...