执行时间的差异来源?

时间:2017-10-06 16:10:24

标签: c++

我想询问在分析某些数学运算时观察到的执行时间变化的来源。我正在观察一些明显的差异,我希望有人可以对此事略有说明:

观察1 :在分析数学运算时,会观察到不同的执行时间。作为我的意思的一个例子,如果编译以下代码并且结果代码分别执行10次,我会观察十个不同的执行时间。 (此外,正如预期的那样,执行时间取决于是使用方法1还是方法2)。

int main()
{
    unsigned x { 0xFFFFFFFF };
    unsigned y; 
    int MAX_LOOP { 1000 };
    boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();
    for( int i = 0; i < MAX_LOOP; i++ )
    {
        y = x >> 31;   // Method 1
    //  y = x/2^31;    // Method 2 (note: this expression is expanded in the actual code)
    }
    boost::posix_time::ptime stop = boost::posix_time::microsec_clock::local_time();
    boost::posix_time::time_duration duration = start - stop;

    // output to std::cout not shown...
}

方法1产生平均执行时间[mean +/- std。 dev。] 575us +/- 50us(!!),而方法2的执行时间平均为12.9us +/- 1.6us。

方法2并不关心我,但方法1似乎有相当高的方差。事实上,方法1观察到的时间范围是190 us!这个执行时间范围对我来说有点令人吃惊。我的问题是,我应该被这一系列执行时间吓到吗?对这种差异有一个很好的解释吗?

观察2 :执行时间不会随着代码中执行的循环次数而缩放。以上统计数据基于MAX_LOOP值1e3。如果我将MAX_LOOP增加到1e8,那么我观察到方法1需要180.487ms +/- 3.139ms,而方法2需要1021.825ms +/- 16.597ms。执行时间的增加不会随着所需绝对执行次数的增加而扩大。那就是:

  • 环计数比:1e8 / 1e3 = 1e5
  • 位移分割轮廓时间的比率:180487/575 = 313
  • 规则整数除法配置文件时间的比率:1021825 / 12.9 = 79211

使用方法1(位移除法),性能增益从基本上为575ns /格分为1.805ns /格。相反,常规整数除法从13ns / div&#34;到10.22ns /&#34;师。规则划分似乎与执行的循环迭代次数成线性比例,但是当循环迭代次数很多时,位移方法似乎表现出极大改善的性能。

我在某个不明显的地方犯了错误吗?如果没有,任何人都可以解释为什么在这种情况下,位移部门的性能提升变化如此之大?编译器是否可能使用默认优化? (如果是这样,(a)优化是否真的 好?,(b)我如何找出编译器默认使用的优化?)

其他可能很重要的事情:

  • Apple LLVM ver 7.0.2(clang-700.1.81)
  • 提升1.65.1(严格用于计时)
  • 在我的笔记本电脑的一个核心上进行执行
  • 在没有优化的情况下编译使用:clang ++ -std = c ++ 11 -I ... -L ... -lboost_system [fname.cpp] -o [fname]

0 个答案:

没有答案