我正在尝试使用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"(我在哪里可以找到它的信息?)似乎来自写输出文件。现在,令我困惑的是,如果我注释掉所有的
我错过了什么吗?
补充: 没有
总共: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
总共: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%位于,'_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秒计算中只有0.1秒)。代码本质上是:
ofstream outfile("out.txt");
for loop:
SliceStep::DoStep()
outfile << 'result'
outfile.close()
更新:我使用boost::timer进行计时,从分析器开始的地方开始计时,到它结束的地方结束。我不使用线程或任何高级操作。