1

ソフトウェアを最適化するために、ソフトウェアのプロファイルを作成しようとしています。

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ファイルが作成されない理由と、プロファイリングでデータが収集されない理由を知っている人はいますか?

よろしくお願いいたします。

よろしくお願いします;

4

1 に答える 1