【问题标题】:Using GPerf Tool: not working, issue with redirection?使用 GPerf 工具:不工作,重定向问题?
【发布时间】:2016-07-02 08:59:47
【问题描述】:

我正在尝试分析我的软件以优化它。

我将gprof 与编译标志-g -pg -O3 一起使用,但结果没有给我足够的精度。

这是我的编译堆栈跟踪:

$: make clean; make;

rm -f ./obj/*.o
rm -f ./bin/mdk-verifier
rm -f ./grammar/modal.output
rm -f ./grammar/modal.tab.h
rm -f ./grammar/*.cpp
rm -f ./lex.backup

bison -d -t -l -v -o ./grammar/modal.tab.c ./grammar/modal.y && mv ./grammar/modal.tab.c ./grammar/modal.tab.cpp
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./grammar/modal.tab.cpp -o ./obj/modal.tab.o
flex -l -b -o./grammar/lex.yy.cpp ./grammar/modal.lex   
g++ -O3 -g -pg -I./include -c ./grammar/lex.yy.cpp -o ./obj/lex.yy.o
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/Kripke.cc -o ./obj/Kripke.o   
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/Term.cc -o ./obj/Term.o 
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/BooleanConstant.cc -o ./obj/BooleanConstant.o 
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/Variable.cc -o ./obj/Variable.o 
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/PropositionalVariable.cc -o ./obj/PropositionalVariable.o 
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/Operation.cc -o ./obj/Operation.o 
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/BooleanOperation.cc -o ./obj/BooleanOperation.o 
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/ModalOperation.cc -o ./obj/ModalOperation.o   
g++ -O3 -g -pg -fPIC -std=c++11  -I./include -c ./src/Formula.cc -o ./obj/Formula.o 
g++ -O3 -g -pg -fPIC -std=c++11  -o ./obj/Main.o -c ./src/Main.cc 
g++ -O3 -g -pg -static -lprofiler -o ./bin/mdk-verifier ./obj/modal.tab.o ./obj/lex.yy.o ./obj/Kripke.o ./obj/Term.o ./obj/BooleanConstant.o ./obj/PropositionalVariable.o ./obj/Variable.o ./obj/Operation.o ./obj/BooleanOperation.o ./obj/ModalOperation.o ./obj/Formula.o ./obj/Main.o               

这就是我如何称呼我的程序:

$: ./bin/mdk-verifier ./problem.txt < solution.txt 

所以执行后,一切都很好,我得到了一个gmon.out 文件。我正在执行命令gprof ./bin/mdk-verifier | more,得到以下结果:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 34.00      2.13     2.13       18   118.33   118.33  ModalOperation::checkBranch(Kripke&, unsigned int)
  ...
  ...
  5.91      4.98     0.37 54684911     0.00     0.00  BooleanOperation::checkBranch(Kripke&, unsigned int)
  4.63      5.27     0.29 54684911     0.00     0.00  PropositionalVariable::checkBranch(Kripke&, unsigned int)

很明显,对 ModalOperation::checkBranch 的调用计数溢出了......并且通过每次我进入这个函数时进行显示,我确实进行了超过 18 个调用......

所以我考虑使用另一个更精确的分析器,并通过 Google 找到了 GPerfTools

我想用它,我安装在我的 Ubuntu 上:

  • libgoogle-perftools-dev
  • google-perftools

并通过关注tutorial,他们要求我设置环境变量CPUPROFILE

我做到了,我得到了:

 $: env | grep "CPU"
 CPUPROFILE=./prof.out

我还在我的可执行文件的链接过程中输入了-lprofiler,所以我认为一切正常,我可以开始分析文件./prof.out中的数据

但不幸的是,这个文件没有出现...没有创建任何内容,所以我无法配置任何内容...

有没有人知道为什么没有创建 ./prof.out 文件以及为什么分析没有收集数据?

提前感谢您的帮助!

最好的问候;

【问题讨论】:

  • 仔细检查所有内容。你对你所做的事情的描述看起来很合理。
  • 啊。一个可能的原因可能是您的应用程序仍然使用 -pg 构建。

标签: profiler gperftools


【解决方案1】:

您的目的是在您的软件中节省时间。多个问题,首先是负面的:

  • -O3:编译器可以优化某些东西。它不能优化只有你可以优化的东西。它可以做的是通过打乱代码使它们难以找到。使用 -O3 的时间是你找到并修复了可以做到的。

  • gprof 是可敬的,但仅此而已。它对程序计数器进行采样并对函数调用进行计数。 Here is a list of problems with that. 它确实给了你一个调用图,但是speedups can easily hide in that

  • gperftools 更好(根据 Aliaksei 的评论进行了修订),因为它是一个真正的堆栈采样器。通常它是一个“CPU-profiler”,在这种模式下它对阻塞所花费的任何时间都是视而不见的,比如 I/O 或睡眠。然而,如果你设置环境变量CPUPROFILE_REALTIME=1,你可以让它在挂钟时间采样,所以它会看到I/O、睡眠和其他阻塞系统调用。 它有许多输出选项。 使用行号信息来查看实际堆栈样本本身的一小部分随机选择似乎并不容易。

现在是积极的:

  • 有很多人使用的方法(不是产品)random pausing。 这个想法是用质量代替数量 - 在正确的时间获取堆栈样本。 在感兴趣的时间间隔内只需要很少,例如 5、10 或 20。如果某件事花费了 95% 的时间,那么每个堆栈样本都有 95% 的机会出现在正确的时间。 然后检查每个堆栈样本,看看发生了什么——不要只是总结/累积/平均/假装统计。 (如果这是在调试器下手动完成的,您还可以检查数据变量,从而更好地了解程序为什么要花那个时间。) 目标是发现问题,而不是测量它。 如果您在多个样本上看到它,那么您可以避免的任何事情都将节省大量时间。 Here's how much. 您需要查看两次的样本越少,它会节省的越多。 如果您想确切了解它为您节省了什么,只需在前后使用秒表即可。 而且不要只做一次。每次解决问题,都会发现更多问题,所以如果你继续这样做,你可能会得到dramatic speedups

【讨论】:

  • btw gperftools 的 cpu profiler 也可以进行挂钟时间分析。
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2013-02-06
相关资源
最近更新 更多