gprof messing up
I am trying 2 profile a cpp code. I compiled with -pg flags and after I profiled it to get the output I got some very weird function names. this is the make file I am using:
# 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 开发者_Go百科-p $(PREFIX)/bin
cp -f $(TARGET) $(PREFIX)/bin/$(TARGET)
This is a sample of the gprof output:
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)
and these are the true function names in the file:
void annealer_thread::Run()
Any flags im forgetting? and why is the profiling also showing the parameters of the functions? is it because they are classes? is it because it is cpp? I am familiar with gprof and c but this is my first encounter with cpp
Any help is welcome:) cheers=)
In C++, function names include the class they belong to, their return type, and all their argument types. That's done by "mangling" the names. This is so functions can be overloaded with different argument types. gprof
is aware of that and can un-mangle them.
What you're seeing in the flat profile is that the PC is often captured in some class library routines. That's helpful only if it gives you a clue what the call paths are in your code that end up in those routines. The call graph (instrumentation) is some help there.
And of course it's blind to any I/O you'd rather not be doing.
The program could be spending 99% of its time doing I/O deep in a library, where you don't know it's happening and neither does gprof
.
Take a look at Zoom.
精彩评论