ソフトウェアを最適化するために、ソフトウェアのプロファイルを作成しようとしています。
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
そしてチュートリアルに従って、彼らは私に環境変数を設定するように頼んだCPUPROFILE
私はやったと私は得る:
$: env | grep "CPU"
CPUPROFILE=./prof.out
実行可能ファイルのリンク中にも入れ-lprofiler
たので、すべて問題なく、ファイル内のデータのプロファイリングを開始できると思いました./prof.out
しかし、残念ながら、このファイルは表示されません...何も作成されていないため、何もプロファイルできません...
./prof.out
ファイルが作成されない理由と、プロファイリングでデータが収集されない理由を知っている人はいますか?
よろしくお願いいたします。
よろしくお願いします;