【发布时间】: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