1

ちょっと初心者っぽい質問があります。私はLinuxにまったく慣れていません。

プログラムが実行した条件付きジャンプの数 (つまり、プログラムが実行した if() や while() などの数) を数えたいと思います。

perf でこれを行うことができると言われ、それを読みましたが、完全に迷っています。

誰か教えてくれませんか?たとえば、次のような C++ プログラムがあります。

...some code...
if(a=5)
  x=3;
else
  x=5;
...some code...

このコードが tmp というファイルにコンパイルされているとします。

以下を発行してみました。

perf stat ./tmp

しかし、取得するブランチの数は毎回異なります。

私は何か間違ったことをしていますか?

編集:ソースコードが利用できないと仮定していることに言及する必要があります。だから私はバイナリを見ています。

4

2 に答える 2

0

main関数の前に実行されるコードは毎回異なることを行う可能性があるため、プログラムを実行するたびに分岐の数が変わるのは論理的です。(例:perf stat true毎回異なる数のブランチを報告します)。

興味深いのperf statは、プログラムの実行速度に悪影響を与える分岐ミスの数です (100% の分岐ミスがあるプログラムを長時間実行しない限り、それは見られないため、実際にはそうではありません)。重大な悪影響)。

于 2012-06-15T18:54:21.103 に答える
0

わかりました解決策を見つけましたが、ここに投稿するのを忘れていました。分岐のカウントは、常にプログラム内の分岐 (if()、whiles()...) の数に対応する必要があります。perf stat の引数として、条件付き分岐命令のハードウェア イベント番号 + Umask (参照: ソフトウェア エンジニア向けインテル マニュアル) を使用することで、それを実行できることがわかりました!

于 2014-05-19T14:18:17.957 に答える