2011-01-25 4 views
0

Я пробовал 2 профиля cpp-кода. Я скомпилировал с флагами -pg и после того, как я профилировал его, чтобы получить результат, я получил некоторые очень странные имена функций. это файл делает я использую:gprof messing up

# 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) 

Это пример вывода дргоГо:

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? Я знаком с дргоЕ и с, но это моя первая встреча с CPP

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

+0

Как обычно в нетривиальной программе, время CPU в основном расходуется в библиотечных программах, что не говорит вам о том, как их вызвали. Даже когда вы получаете ответы на эти вопросы, [с gprof у вас, вероятно, будет гораздо больше вопросов] (http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343). –

ответ

1

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

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

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

Посмотрите на Zoom.

+0

как я могу их развязать? Я устал от флага -T, и я думаю, что это сработало. У вас есть другие идеи? –

+0

@Syntax_Error: 'gprof' делает это за вас. 'gdb' также может сделать это, если вы попробуете [случайную паузу] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024 # 378024), как я думаю, я предложил вам раньше. Другой способ может быть, если gnu-компоновщик может дать вам файл с измененным картографическим файлом, но я догадываюсь об этом. –

+0

да, у вас есть случайная пауза ... но Im kinda после автоматической вещи больше! получил несколько тестов, чтобы сделать некоторые случайные паузы, было бы трудоемким! плохо попытайтесь найти способ 2 de-mangle выход! пока флаг -T отлично работает со мной! thnks –