Gprof 结果:什么是“alloc_mmap”?
我的程序短期运行的结果如下:
67.93 3.24 3.24 grid::rKfour(int, int)
9.43 3.69 0.45 alloc_mmap
5.03 3.93 0.24 30001 0.01 0.01 grid::timeStep()
3.04 4.08 0.15 42007105 0.00 0.00 linkers::linkers(linkers const&)
2.94 4.22 0.14 6360900 0.00 0.00 particle::fulldistance(particle&)
2.73 4.35 0.13 blas_thread_server
...
ldd 的输出是
linux-vdso.so.1 => (0x00007fffe2bea000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007eff34595000)
libboost_filesystem.so.1.46.1 => /usr/lib/libboost_filesystem.so.1.46.1 (0x00007eff34377000)
libboost_system.so.1.46.1 => /usr/lib/libboost_system.so.1.46.1 (0x00007eff34172000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007eff33f16000)
libglut.so.3 => /usr/lib/libglut.so.3 (0x00007eff33cd0000)
libGLU.so.1 => /usr/lib/x86_64-linux-gnu/libGLU.so.1 (0x00007eff33a62000)
libGLEW.so.1.5 => /usr/lib/libGLEW.so.1.5 (0x00007eff3380c000)
libboost_thread.so.1.46.1 => /usr/lib/libboost_thread.so.1.46.1 (0x00007eff335f3000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007eff332eb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007eff33067000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007eff32e51000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff32ab1000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff347c4000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007eff3288d000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007eff32555000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007eff32341000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007eff3213e000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007eff31f38000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007eff31d31000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007eff31b26000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007eff31922000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007eff31705000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007eff314fd000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007eff312f9000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007eff310f3000)
Can Anybody recognize "alloc_mmap"?
My results for a short run of my program are as follows:
67.93 3.24 3.24 grid::rKfour(int, int)
9.43 3.69 0.45 alloc_mmap
5.03 3.93 0.24 30001 0.01 0.01 grid::timeStep()
3.04 4.08 0.15 42007105 0.00 0.00 linkers::linkers(linkers const&)
2.94 4.22 0.14 6360900 0.00 0.00 particle::fulldistance(particle&)
2.73 4.35 0.13 blas_thread_server
...
The output from ldd is
linux-vdso.so.1 => (0x00007fffe2bea000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007eff34595000)
libboost_filesystem.so.1.46.1 => /usr/lib/libboost_filesystem.so.1.46.1 (0x00007eff34377000)
libboost_system.so.1.46.1 => /usr/lib/libboost_system.so.1.46.1 (0x00007eff34172000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007eff33f16000)
libglut.so.3 => /usr/lib/libglut.so.3 (0x00007eff33cd0000)
libGLU.so.1 => /usr/lib/x86_64-linux-gnu/libGLU.so.1 (0x00007eff33a62000)
libGLEW.so.1.5 => /usr/lib/libGLEW.so.1.5 (0x00007eff3380c000)
libboost_thread.so.1.46.1 => /usr/lib/libboost_thread.so.1.46.1 (0x00007eff335f3000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007eff332eb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007eff33067000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007eff32e51000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff32ab1000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff347c4000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007eff3288d000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007eff32555000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007eff32341000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007eff3213e000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007eff31f38000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007eff31d31000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007eff31b26000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007eff31922000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007eff31705000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007eff314fd000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007eff312f9000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007eff310f3000)
Can anybody identify "alloc_mmap"?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我猜您这么问是因为您想看看可以采取哪些措施来提高程序的速度。
如果没有,请忘记这一点。
在 gprof 输出中,重要的数字是第二列,累积秒,因为如果可以使该例程不花费时间,那么您的总时间将减少。
gprof 的问题之一是它忽略了 I/O 等阻塞时间。
由于您的程序正在使用
alloc_mmap
(直接或间接),它将文件映射到内存,因此它正在执行 I/O,这通常是一个不小的成本。gprof 没有看到它。
还有更多 gprof 问题。
如果您使用的是 Linux,您可以尝试像 Zoom 这样的分析器。
它根据挂钟时间进行采样,因此它不会对 I/O 视而不见。
它还为您提供按行/指令(而不仅仅是按函数)的时间使用百分比,因此它将精确定位代码中的行,如果您可以改进/删除它们,将为您带来最大的加速。
(通常这些是函数调用。“自拍时间”很少相关,除非在繁重的数学或紧张的 CPU 循环中,而且无论如何它并不重要。Zoom 会发现它。)
我依赖的方法 就是这个。
I assume you're asking because you want to see what you could do to improve the program's speed.
If not, forget this.
In gprof output, the number that matters is the second column, cumulative seconds, because if that routine could be made to take no time, that is the amount by which your total time would shrink.
One of the problems with gprof is it ignores blocked time like I/O.
Since your program is using
alloc_mmap
(directly or indirectly) it is mapping a file to memory, so it is doing I/O, which is often not a small cost.gprof doesn't see it.
There are more problems with gprof.
If you are on linux, you could try a profiler like Zoom.
It samples on wall-clock time, so it is not blind to I/O.
It also gives you percent time usage by line/instruction, not just by function, so it will pinpoint the lines in your code that, if you could improve/remove them, would give you the most speedup.
(Usually these are function calls. "Self time" is rarely relevant except in heavy math or tight CPU loops, and it doesn't matter anyway. Zoom will spot it.)
The method I rely on is this.
也许您的内存分配器正在使用 mmap 进行大量分配。您应该首先确认这一点(alloc_mmap 中的 gdb 断点应该可以工作),也许可以使用 mallopt。
Maybe your memory allocator is using mmap for large allocations. You should first confirm this (gdb breakpoint in alloc_mmap should work) and perhaps increase the threshold with mallopt.