我需要在我们的系统中gprof一个库来检查函数调用,看看我们是否可以再优化它.基本上,我拥有的是
可执行文件A使用共享库myLib.so
我想gprof myLib.so.当我使用-pg选项编译myLib.so源时,它会生成一个.so文件.
但是,针对该库重新编译可执行文件A不会因某种原因生成*.gmon文件.需要做什么?我应该静态链接myLib吗?如果是这样,请告诉我如何.我是新手,所以请原谅我的无知.我每天都在学习
提前致谢.
我有一个我想用gprof配置的程序.问题(看似)是它使用套接字.所以我得到这样的事情:
::select(): Interrupted system call
Run Code Online (Sandbox Code Playgroud)
我不久就遇到了这个问题,放弃了,继续前进.但我真的希望能够使用gprof来描述我的代码,如果可能的话.我能做什么?我缺少一个gprof选项吗?套接字选项?在存在这些类型的系统调用时,gprof是完全无用的吗?如果是这样,有可行的替代方案吗?
编辑:平台:
我尝试用gprof分析我的C++程序.程序本身运行了大约53秒,所以我不明白为什么它说,主要只运行了大约8.29秒.对此有何解释?
这是一段摘录:
index % time self children called name
<spontaneous>
[2] 20.5 0.00 8.29 main [2]
0.00 8.28 1/1 MPQS::start(std::basic_ofstream<char, std::char_traits<char> >&) [3]
0.00 0.01 1/1 MPQS::MPQS(NTL::ZZ, long) [36]
0.00 0.00 1/1 MPQS::~MPQS() [78]
-----------------------------------------------
0.00 8.28 1/1 main [2]
[3] 20.5 0.00 8.28 1 MPQS::start(std::basic_ofstream<char, std::char_traits<char> >&) [3]
7.15 1.08 801/801 MPQS::sieve() [4]
0.00 0.04 801/801 MPQS::find_smooth_vals() [23]
0.01 0.00 1/1 MPQS::try_solutions(NTL::mat_GF2&) [35]
0.00 0.00 801/801 MPQS::compute_coeffecients() [59]
-----------------------------------------------
7.15 1.08 801/801 MPQS::start(std::basic_ofstream<char, std::char_traits<char> >&) [3]
[4] 20.4 7.15 …Run Code Online (Sandbox Code Playgroud) 我有一个在嵌入式处理器(ARM)上运行的应用程序,我想分析应用程序,以了解它在哪里使用系统资源,如CPU,内存,IO等.应用程序运行在Linux,所以我假设有许多可用的分析应用程序.有没有人有什么建议?
谢谢!
编辑:我还应该添加我们使用的Linux版本有些旧(2.6.18).不幸的是,我现在没有很多控制权.
我正在寻找一种用C语言描述我的openMPI程序的方法,我正在使用带有Linux Ubuntu 9.10的openMPI 1.3,我的程序是在Intel Duo T1600下运行的.
我想要的是在程序的任何部分中的缓存未命中,内存使用和执行时间.
谢谢你的答复
我想PERF到输出的原始样本数,而不是百分比.这对于确定我是否加快了我正在尝试优化的功能非常有用.
要清楚,我想做点什么
perf record ./a.out
perf report
Run Code Online (Sandbox Code Playgroud)
并查看在a.out中对每个函数进行多少次采样.
Shark可以在Mac上做到这一点,我相信Xperf.这是否可以在Linux上使用perf?
我有这个程序需要2.34秒才能运行,gprof表示它只需要1.18秒.我已经在其他地方读过答案,建议如果例如程序受I/O限制,gprof可能会出错,但这个程序显然不是.
这也适用于我试图描述的有用程序.这不是特定于这个琐碎的测试用例.
(同样在这种情况下,gprof表示main()占用了程序运行时间的100%以上,这是一个非常愚蠢的错误但不会给我带来麻烦.)
$ cat test.c
int main() {
int i;
for (i=0;i<1000000000;i++);
}
$ gcc test.c -o test
$ time ./test
real 0m2.342s
user 0m2.340s
sys 0m0.000s
$ gcc test.c -o test -pg
$ time ./test
real 0m2.342s
user 0m2.340s
sys 0m0.000s
$ gprof test |head
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
101.33 1.18 1.18 main
% the percentage of the total running time of …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用hotshot优化一些代码,我希望它很好,因为它是高性能的分析器和所有.但由于某种原因,我得到了非常不准确的结果.在我最近的分析运行中,hotshot报告了我称之为7.946秒的顶级函数的累积时间.但是,如果没有计时,我可以告诉它需要更长的时间.使用time.time()自己定时运行时间给我一个42.465秒的运行时间.我猜这是因为hotshot不计算系统IO时间或其他什么,我的程序是批量处理大量的二进制文件?
但是,使用更多time.time()块我将大部分额外时间使用(hotshot未注意到)缩小到不执行任何IO的较低级别处理功能.hotshot报告该功能的总时间和累计时间分别为4.414和6.185秒.但是,再次使用time.time()语句我发现它的累积时间超过30秒.在一个相对简单的代码块中花费的累积时间是7.32秒,比在整个函数中花费的热点更长.该块看起来像这样:
format = element[1]
if isinstance(format, tuple):
format, operator, operand = format
else:
operator, operand = (None, None)
Run Code Online (Sandbox Code Playgroud)
而已.这个区块运行了900多万次,所以也许我不应该感到惊讶的是花了这么多时间.但显然没有IO在这里完成.为什么热点如此低估了这个功能(以及整个程序)的时间?
在你问之前,不,我没有使用多线程或类似的东西.
我想知道像 quantify 这样的产品如何在不修改代码的情况下测量函数/方法中花费的时间。有人知道吗?
您是否有描述如何开始编写自己的工具的网页?
我刚开始使用 gprof 并试图生成调用图。我正在使用 cmake 来设置我的 makefile,我正在设置 CMAKE_EXE_LINKER_FLAGS = -gp 以启用分析。我唯一启用的 cxx 标志是 -g。
然后我简单地在我的 gmon.out 文件上调用 gprof。
生成的输出文件只有一个平面配置文件,其中的调用、自身 ts/call 和总 ts/call 都是空的。
更重要的是,它不会生成调用图。如果我尝试在运行 gprof 时显式提供 -q 以生成调用图,它会显示“文件缺少调用图数据”。
我不确定我在这里做错了什么,希望得到解决这个问题的指示。
谢谢。