我試圖開始使用Google Perf Tools來分析一些CPU密集型應用程序。這是一個統計計算,使用`ofstream'將每個步驟轉儲到一個文件。我不是C++專家,所以我很難找到瓶頸。我第一遍給出的結果:C++分析(谷歌CPU處理工具)究竟是什麼措施?
Total: 857 samples 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輸出是:
Total: 790 samples 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秒的計算即0.1秒) 。該代碼基本上是:
ofstream outfile("out.txt");
for loop:
SliceStep::DoStep()
outfile << 'result'
outfile.close()
更新:我定時使用boost ::計時器,開始在那裏探查開始和結束的地方結束。我不使用線程或任何幻想。
你如何測量運行時間? 爲這兩種配置做一次「time ./yourprogramm」。 你使用多線程嗎? – ebo 2009-06-16 19:25:34
用時間運行並測量sys/usr時間。分析器數字表明,如果沒有輸出,您的運行時間應該減少40%。最簡單的解釋是分析器測量是偏斜的。 – ebo 2009-06-16 19:42:20