問題タブ [gperftools]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++プロファイリング(google cpu perfツール)は正確に何を測定しますか?
Google Perf Toolsを使い始めて、CPUを集中的に使用するアプリケーションのプロファイルを作成しようとしています。これは、「ofstream」を使用して各ステップをファイルにダンプする統計計算です。私はC++の専門家ではないので、ボトルネックを見つけるのに苦労しています。私の最初のパスは結果を与えます:
実際の計算はすべてSliceStep::DoStepで行われるため、これは驚くべきことです。「_write$UNIX2003」(これが何であるかはどこで確認できますか?)は、出力ファイルの書き込みに由来しているようです。さて、私を混乱させるのは、すべてのoutfile << "text"
ステートメントをコメントアウトしてpprofを実行すると、95%がインにSliceStep::DoStep
なり、 `_ write $UNIX2003'が消えることです。ただし、合計時間で測定すると、アプリケーションの速度は上がりません。全体の速度は1%未満です。
私は何が欠けていますか?
outfile <<
追加:ステートメントなしのpprof出力は次のとおりです。
これは、パフォーマンスの目に見える向上が見られないことを除いて、私が期待するもののように見えます(10秒の計算で.1秒)。コードは基本的に次のとおりです。
更新:boost :: timerを使用してタイミングを調整し、プロファイラーの開始位置から開始して終了位置で終了します。私はスレッドや派手なものは使いません。
c++ - gperftools-2.0 をインストールしましたが、CPU プロファイル統計を取得できません
gperftools-2.0 をインストールしましたが、CPU プロファイル統計を取得できません
以下は、統計を取得するための私の手順です。
- gperftools tar -xzvfj gperftools-2.0.tar.gz をインストールします。
2.cppファイルtest.cppを編集
g++ test.cpp をコンパイル -o テスト -O0 -I/usr/local/include/ -L/usr/local/lib/ -lprofiler
実行./テスト
レポート pprof ./test --text test.prof
その出力は: Using local file ./test. ローカル ファイル test.prof を使用します。
私の手順で何が問題になっていますか?
profiling - Google パフォーマンス ツールの使用方法
Google パフォーマンス ツール (google-perftools
およびlibgoogle-perftools4
ubuntu のパッケージ) を使い始めたばかりです。問題は、CPU プロファイリングですべての関数の結果が得られないことです。これは私のコードです:
としてコンパイルg++ test.cc -lprofiler -o a.out
これは私がコードを実行する方法です:
私もこれを試しました:
そして、これは私が得たものですgoogle-pprof --text a.out dump.txt
:
しかし、foo関数に関する情報はありません!
私のシステム情報: ubuntu 12.04 g++ 4.6.3
それで全部です!
profiling - GPerfTools のサンプル数の解釈
GPerfTools が生成するテキスト出力を読むのに少し苦労しています。問題の一部は、サンプリング方法がどのように機能するかを完全に理解していないことだと思います。
ウィキペディアから、サンプル関数に基づくプロファイラーは通常、OS に割り込みを送信し、プログラムの現在の命令ポインターを照会することによって機能することがわかっています。アセンブリに関する私の知識は少し錆びているので、命令ポインターm
がいつでもメソッドを指している場合、それは何を意味するのだろうか? つまり、関数が呼び出されようとしていることを意味するのでしょうか、それとも現在実行されていることを意味するのでしょうか、あるいはその両方でしょうか?
最初のケースではサンプル数 (つまり、サンプルを取得している間に m が見られる回数) は m の絶対呼び出し回数に変換されますが、後者の場合は単純に見られた回数に変換されるため、違いがあります。つまり、このメソッドで費やされた相対的な時間の単なる指標です。
誰かが明確にすることができますか?
gcc - gperftools CPU プロファイラーはどのように正確に起動しますか?
gperftools のドキュメントにはlibprofiler
、ターゲット プログラムにリンクする必要があると記載されています。
(プログラムのコードを変更することなく)。
次に、特定の環境変数を使用してプログラムを実行する必要があります。
問題はlibprofile
、プロファイラーがロードされただけで、その関数が呼び出されていない場合、どのようにしてプロファイラーを開始および終了する機会があるかということです。
そのライブラリにはコンストラクタ関数はありません (証明)。 ライブラリ コード内の「CPUPROFILE」はすべて、プロファイラーが開始される場所を指すわけではありません。
次はどこを見ればいいですか?
c++ - _L_unlock_16 でのパフォーマンスのボトルネック
マルチスレッド プログラムのパフォーマンスの問題をデバッグするために、Google パフォーマンス ツールの CPU プロファイラーを使用しようとしています。シングル スレッドでは 250 ミリ秒かかりますが、4 スレッドでは約 900 ミリ秒かかります。
私のプログラムには、スレッド間で共有される mmap されたファイルがあり、すべての操作は読み取り専用です。また、私のプログラムは、スレッド間で共有されない多数のオブジェクトを作成します。(具体的には、私のプログラムは CRF++ ライブラリを使用してクエリを実行します)。マルチスレッドでプログラムのパフォーマンスを向上させる方法を見つけようとしています。gperf ツールの CPU プロファイラーによって作成されたコール グラフは、私のプログラムが_L_unlock_16で多くの時間 (約 50%) を費やしていることを示しています。
Web で _L_unlock_16 を検索すると、libpthread に関連していることを示唆する正規のバグ レポートがいくつか指摘されました。しかし、それ以外に、デバッグに役立つ情報を見つけることができませんでした。
私のプログラムが何をするかの簡単な説明。ファイルに単語がほとんどありません (4)。私のプログラムには、CRF++ を使用して単一の単語を処理する processWord() があります。この processWord() は、各スレッドが実行するものです。私の main() はファイルから単語を読み取り、各スレッドは processWord() を並行して実行します。1 つの単語 (したがって 1 つのスレッドのみ) を処理する場合、250 ミリ秒かかるため、4 語すべて (したがって 4 つのスレッド) を処理する場合、同時に 250 ミリ秒で完了すると予想していましたが、前述のように約 900 ミリ秒かかります。これは実行のコールグラフです - https://www.dropbox.com/s/o1mkh477i7e9s4m/cgout_n2.png
私のプログラムが _L_unlock_16 で多くの時間を費やしている理由と、それを軽減するためにできることを理解したいです。