是否可以使用gprof在C++中对单个函数进行换行?
就像是:
gprof -l -F function_name ...
Run Code Online (Sandbox Code Playgroud)
,这似乎不起作用.
我有一个程序,其中花费了大量的时间来加载和保存数据.现在我想知道每个函数在总运行时间百分比方面花费了多少时间.但是,我想从分析器考虑的总时间中排除加载和保存函数所花费的时间.有没有办法使用gprof或任何其他流行的探查器?
我试图在我的程序中找到性能问题,从而通过分析对代码进行检测.gprof创建一个像这样的平面轮廓:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
27.97 4.10 4.10 std::_Deque_iterator<char, char&, char*>::_Deque_iterator(std::_Deque_iterator<char, char&, char*> const&)
6.96 5.12 1.02 std::_Deque_iterator<char, char&, char*>::difference_type std::operator-<char, char&, char*>(std::_Deque_iterator<char, char&, char*> const&, std::_Deque_iterator<char, char&, char*> const&)
5.12 5.87 0.75 std::__deque_buf_size(unsigned int)
4.23 6.49 0.62 std::_Deque_iterator<char, char&, char*>::operator+=(int)
3.41 6.99 0.50 std::deque<char, std::allocator<char> >::begin()
1.91 7.27 0.28 7896 0.04 0.04 std::vector<MyClass, std::allocator<MyClass> >::_M_insert_aux(__gnu_cxx::__normal_iterator<MyClass*, std::vector<MyClass, MyClasst> > >, MyClassconst&)
1.91 7.55 0.28 …Run Code Online (Sandbox Code Playgroud) 首先,我正在运行MacOSX 10.7.1.我安装了所有正确的Xcode 4和所有库,以使用C语言.
我在shell中运行gprof命令时遇到了麻烦.我将逐步解释我正在做的事情以及我收到的输出.
步骤1:
~ roger$ cd Path/to/my/workspace
~ roger$ ls
Run Code Online (Sandbox Code Playgroud)
输出(步骤1):
queue.c queue.h testqueue.c
Run Code Online (Sandbox Code Playgroud)
第2步:
~ roger$ gcc -c -g -pg queue.c
~ roger$ ls
Run Code Online (Sandbox Code Playgroud)
输出(第2步):
queue.c queue.h queue.o testqueue.c
Run Code Online (Sandbox Code Playgroud)
第3步:
~ roger$ gcc -o testqueue -g -pg queue.o testqueue.c
~ roger$ ls
Run Code Online (Sandbox Code Playgroud)
输出(步骤3):
queue.c queue.h queue.o testqueue testqueue.c
Run Code Online (Sandbox Code Playgroud)
第4步:
~ roger$ ./testqueue
~ roger$ ls
Run Code Online (Sandbox Code Playgroud)
输出(步骤4):
enqueue element 16807
head=0,tail=1
enqueue element 282475249
head=0,tail=2
enqueue element 1622650073
head=0,tail=3
enqueue element 984943658
head=0,tail=4
enqueue element 1144108930
head=0,tail=5
enqueue …Run Code Online (Sandbox Code Playgroud) 我敢肯定,每个人都知道golang知道,博客文章在这里.
再次阅读,我想知道是否使用gccgo而不是go build会增加速度.在我的典型用例(科学计算)中,gccgo生成的二进制文件总是比生成的二进制文件更快go build.
所以,只需抓住这个文件:havlak6.go并编译它:
go build havlak6.go -O havlak6_go
gccgo -o havlak6_gccgo -march=native -Ofast havlak6.go
Run Code Online (Sandbox Code Playgroud)
惊喜!
$/usr/bin/time ./havlak6_go
5.45user 0.06system 0:05.54elapsed 99%CPU
$/usr/bin/time ./havlak6_gccgo
11.38user 0.16system 0:11.74elapsed 98%CPU
Run Code Online (Sandbox Code Playgroud)
我很好奇并且想知道为什么"优化"编译器会产生较慢的代码.
我试图gprof在gccgo生成的二进制文件上使用:
gccgo -pg -march=native -Ofast havlak6.go
./a.out
gprof a.out gmon.out
Run Code Online (Sandbox Code Playgroud)
没有运气:
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
Run Code Online (Sandbox Code Playgroud)
如您所见,代码尚未实际分析.
当然,我读过这篇文章,但正如你所看到的,程序执行需要10多秒......样本数应该> 1000.
我也尝试过:
rm a.out gmon.out
LDFLAGS='-g …Run Code Online (Sandbox Code Playgroud) 如何在CMakeLists.txt中为GNU g ++的编译器和链接器设置gprof标志?
我目前的做法,
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -pg")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -pg")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -pg")
Run Code Online (Sandbox Code Playgroud)
不允许gprof对C++函数进行解码.有任何想法吗?(我正在使用C++ 11)
需要分析用 C++ 编写的守护进程,gprof 说它需要终止进程以获取 gmon.out。我想知道有人有使用 ctrl-c 获取 gmon.out 的想法吗?我想找出cpu周期的热点
我刚开始使用 gprof 并试图生成调用图。我正在使用 cmake 来设置我的 makefile,我正在设置 CMAKE_EXE_LINKER_FLAGS = -gp 以启用分析。我唯一启用的 cxx 标志是 -g。
然后我简单地在我的 gmon.out 文件上调用 gprof。
生成的输出文件只有一个平面配置文件,其中的调用、自身 ts/call 和总 ts/call 都是空的。
更重要的是,它不会生成调用图。如果我尝试在运行 gprof 时显式提供 -q 以生成调用图,它会显示“文件缺少调用图数据”。
我不确定我在这里做错了什么,希望得到解决这个问题的指示。
谢谢。
我正在使用 -pg 选项运行我的程序。当我打开输出 gmon.out 时,它只有累积列表,而不是调用图。我该如何解决这个问题?
我知道之前有人问过这个问题:gprof - 文件缺少调用图数据但没有人真正回答这个问题,只给出了 gprof 替代方案的建议。
我知道以前有人问过类似的问题,但是:
-no-pie了链接器参数,但仍然没有结果。GNU Prof 的版本是 2.36.1该程序是本教程中的代码,复制如下:
//test_gprof.c
#include<stdio.h>
void new_func1(void)
{
printf("\n Inside new_func1()\n");
int i = 0;
for(;i<0xffffffee;i++);
return;
}
void func1(void)
{
printf("\n Inside func1 \n");
int i = 0;
for(;i<0xffffffff;i++);
new_func1();
return;
}
static void func2(void)
{
printf("\n Inside func2 \n");
int i = 0;
for(;i<0xffffffaa;i++);
return;
}
int main(void)
{
printf("\n Inside main()\n");
int i = …Run Code Online (Sandbox Code Playgroud)