Google Perf Toolsを使い始めて、CPUを集中的に使用するアプリケーションのプロファイルを作成しようとしています。これは、「ofstream」を使用して各ステップをファイルにダンプする統計計算です。私はC++の専門家ではないので、ボトルネックを見つけるのに苦労しています。私の最初のパスは結果を与えます:
合計:857サンプル 357 41.7%41.7%357 41.7%_write $ UNIX2003 134 15.6%57.3%134 15.6%_exp $ fenv_access_off 109 12.7%70.0%276 32.2%scythe :: dnorm 103 12.0%82.0%103 12.0%_log $ fenv_access_off 58 6.8%88.8%58 6.8%scythe :: const_matrix_forward_iterator :: operator * 37 4.3%93.1%37 4.3%scythe :: matrix_forward_iterator :: operator * 15 1.8%94.9%47 5.5%std :: transform 13 1.5%96.4%486 56.7%SliceStep :: DoStep 10 1.2%97.5%10 1.2%0x0002726c 5 0.6%98.1%5 0.6%0x000271c7 5 0.6%98.7%5 0.6%_write $ NOCANCEL $ UNIX2003
実際の計算はすべてSliceStep::DoStepで行われるため、これは驚くべきことです。「_write$UNIX2003」(これが何であるかはどこで確認できますか?)は、出力ファイルの書き込みに由来しているようです。さて、私を混乱させるのは、すべてのoutfile << "text"
ステートメントをコメントアウトしてpprofを実行すると、95%がインにSliceStep::DoStep
なり、 `_ write $UNIX2003'が消えることです。ただし、合計時間で測定すると、アプリケーションの速度は上がりません。全体の速度は1%未満です。
私は何が欠けていますか?
outfile <<
追加:ステートメントなしのpprof出力は次のとおりです。
合計:790サンプル 205 25.9%25.9%205 25.9%_exp $ fenv_access_off 170 21.5%47.5%170 21.5%_log $ fenv_access_off 162 20.5%68.0%437 55.3%scythe :: dnorm 83 10.5%78.5%83 10.5%scythe :: const_matrix_forward_iterator :: operator * 70 8.9%87.3%70 8.9%scythe :: matrix_forward_iterator :: operator * 28 3.5%90.9%78 9.9%std :: transform 26 3.3%94.2%26 3.3%0x00027262 12 1.5%95.7%12 1.5%_write $ NOCANCEL $ UNIX2003 11 1.4%97.1%764 96.7%SliceStep :: DoStep 9 1.1%98.2%9 1.1%0x00027253 6 0.8%99.0%6 0.8%0x000274a6
これは、パフォーマンスの目に見える向上が見られないことを除いて、私が期待するもののように見えます(10秒の計算で.1秒)。コードは基本的に次のとおりです。
ofstream outfile("out.txt");
for loop:
SliceStep::DoStep()
outfile << 'result'
outfile.close()
更新:boost :: timerを使用してタイミングを調整し、プロファイラーの開始位置から開始して終了位置で終了します。私はスレッドや派手なものは使いません。