Ben*_*Ben 12 c++ profiling g++
在使用gprof配置我编写的C++程序的过程中,我注意到绝大部分执行时间都花在函数"frame_dummy"上.更确切地说,gprof输出的平面轮廓中的第一个条目显示花费的样本时间占76.38%,而24611191调用名称为frame_dummy的函数.
总之,我想了解双方frame_dummy指的是什么 - 因为我没有命名为这样的任何功能 - 以及这是什么意思我的优化工作.
虽然它不太可能相关,但我应该补充说,该程序旨在使用多重网格算法解决泊松方程,并使用MPI来并行化任务.但是,虽然存在MPI函数调用,但上面提到的gprof输出源自仅运行单个进程.我还应该注意,除了MPI之外,我的程序没有依赖性,并且使用g ++ 4.6.1编译.
Edw*_*per 10
这里有一个非常好的解释:http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html.但我不确定为什么你的程序会在frame_dummy中花费这么多时间,或者为什么会多次调用它.
您的二进制文件中的调试信息可能在某种程度上是损坏的,还是被gprof误读了?或者gprof可能会受到MPI的质疑?这里有一些尝试:在gdb中运行程序,并在frame_dummy函数上使用断点.看它是否真的被称为2400万次,如果真的被称为,那么它的调用是什么.
另外,你能否确认这是crtbegin.o中的frame_dummy,而不是其他一些frame_dummy?
这是crtbegin.c中frame_dummy的源代码 - 通过我对代码的读取,它应该只被调用一次.
另外,我假设你的程序运行并产生正确的结果?(特别是,如果你的程序中存在内存错误,那么你可以得到一些非常奇怪的行为.)
我遇到了同样的问题,这是 gprof 的输出:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
52.00 16.27 16.27 204000 0.08 0.08 frame_dummy
47.46 31.12 14.85 418000 0.04 0.07 f2
0.51 31.28 0.16 21800 0.01 1.42 f1
0.03 31.29 0.01 1980 0.01 14.21 f5
Run Code Online (Sandbox Code Playgroud)
就我而言,当我用gcc -Os而不是编译时它得到了解决gcc -O3:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
53.12 22.24 22.24 200000 0.11 0.11 f4
45.65 41.36 19.11 598000 0.03 0.03 f2
0.69 41.65 0.29 20000 0.01 1.45 f3
0.45 41.84 0.19 39800 0.00 0.32 f1
0.10 41.88 0.04 evaluate
Run Code Online (Sandbox Code Playgroud)
也就是说,gprof 误f4认为frame_dummy.