3

アプリケーションのパフォーマンスに問題があります。私はStackoverflowでこの答えを見つけました: https ://stackoverflow.com/a/378024/5363

私はそれが好きです。私が本当に理解していないのは、コードの最適化とプロファイリングの関係です。明らかに、最適化されたコードのプロファイルを作成したいのですが、同時に、最適化中に多くの情報が失われます。それで、引用された答えで示唆されているように、デバッガーで最適化されたコードを実行し、それに侵入することは実用的ですか?

LinuxでgccでCMakeを使用していますが、これで違いが生じます。

4

3 に答える 3

5

一般的な法則は、パレートの法則80/20 の法則と呼ばれます。

  • 原因の 20% が結果の 80% を生み出します。

プロファイリングにより、アプリケーションの速度低下やメモリ消費、またはその他の結果をもたらす最も重要な原因の 20% を特定します。そして、20% の原因を修正すると、速度低下やメモリ消費などの 80% に対処できます。

もちろん数字はあくまでも数字です。その精神をあなたに与えるために:

  • 満足するまで最適化を改善するために、本当の主な原因のみに焦点を当てる必要があります。

技術的には、Linux で gcc を使用する場合、「 Linux で実行されている C++ コードをプロファイルするにはどうすればよいですか? 」という質問への回答は、一言で言えば、使用することを提案しています。

于 2013-02-25T10:39:58.850 に答える
1

スタック サンプルを収集する必要がある場合、デバッガーを使用して収集する必要はありません。定期的に pstack を実行します。実行ごとに出力を別のファイルにリダイレクトし、後でそれらのファイルを分析できます。これらのファイルのコール スタックを見ると、ホットな関数がわかる場合があります。デバッグ バイナリは必要なく、完全に最適化されたバイナリで上記を実行できます。

上記を実行するか、参照しているスレッドにリストされていることを実行するよりも、プロファイラーツールを使用することをお勧めします。彼らはすぐに上位のホットな関数を特定し、呼び出し元と呼び出し先のグラフを見ることで呼び出しスタックを理解できます。上記の方法を使用してランダムなスタックを分析するのではなく、呼び出し元と呼び出し先のスタックを理解することに時間を費やします。

于 2013-02-25T10:47:32.397 に答える
1

Schumi が言ったように、pstack のようなものを使用してスタック サンプルを取得できます。ただし、実際に知っておく必要があるのは、サンプルが取得された時点でプログラムが時間を費やしている理由です。関数名のスタックだけからそれを理解できるかもしれません。呼び出しが発生したコード行も確認できるとよいでしょう。引数の値とデータ コンテキストを確認できればなおさらです。その理由は、「ホット スポット」、「遅い方法」、「ボトルネック」、つまり測定ベースの視点を探しているという一般的な概念とは対照的に、探すべき最も価値のあることは、排除できる可能性があることです。

つまり、デバッガーでプログラムを停止するときは、それが何をしているのかをバグであるかのように考えてください。そのようなことをしない方法を見つけてみてください。ただし、別のサンプルを取得して同じことを確認するまで、これを実行しないでください。ただし、そのことを説明します。これで、かなりの時間がかかっていることがわかります。どのくらいの時間?それは問題ではありません。修正後にわかります。あなたはそれがたくさんあることを知っています。2 回見る前に取得する必要のあるサンプルが少ないほど、サイズが大きくなります。

次に「拡大効果」です。その「速度バグ」を修正すると、プログラムの所要時間が大幅に短縮されますが、それだけではありません。他にもありますが、今はより多くの時間を費やしています。だから、もう一度やり直してください。これを終える頃には、プログラムがおもちゃよりも大きい場合、その速さに驚かれることでしょう。 これは 43 倍のスピードアップです。 これは730倍のスピードアップです。 これがその背後にある退屈な数学です。

おわかりのように、ツールの問題は、サンプリングの容易さに対して代償を払っていることです。あなたはそれを測定と考えているので、コードが何をしているのかという理由、つまり疑わしい理由に集中していません。これにより、コードを高速化する機会を逃し、拡大効果を見逃すことになり、最終的に可能な高速化のはるか手前で停止することになります。

編集:炎の謝罪。あなたの質問に答えるために、私はコンパイラの最適化を最後までオンにしません。これは、より大きな問題を隠す可能性があるためです。次に、最適化がオンになっているビルドを実行しようとしますが、シンボリック情報が残っているため、デバッガーは妥当なスタック トレースを取得して変数を調べることができます。スピードアップのリターンが減少している場合は、全体の時間を測定するだけで、オプティマイザーがどれだけの違いをもたらしたかがわかります。そのためのプロファイラーは必要ありません。

于 2013-02-25T13:42:11.763 に答える