整数乘法和除法之间出现意外的明显性能差异

时间:2014-04-09 07:56:40

标签: c++ algorithm optimization

我正在实现一个简单的二进制搜索来查找整数的平方根。代码运行正常。但是,如果我将if中的条件从mid * mid > x更改为mid > (x / mid),那么对于大量输入似乎会超时。那么一切都很好。

int sqrt(int x) {
    if(x < 0) return -1;
    if(x <= 1) return x;
    int l,r,mid,ans;
    l = 0;
    r = x;
    while(l <=r ){
        mid = (l + r) / 2;

        if((mid * mid) == x) return mid;

        if((mid * mid) > x ){  //<===== here if I change to mid > (x / mid)
            r = mid - 1;

        }else{
            l = mid + 1;
            ans = mid;
        }
    }

    return ans;
}

};

因此我得出结论,除法比乘法更快。但到目前为止我所做的研究都指出乘法比分裂更快。

2 个答案:

答案 0 :(得分:3)

mid > (x / mid) 

优于

(mid * mid) > x

因为你避免了整数溢出。

答案 1 :(得分:3)

大输入的问题是mid * mid > x可能会溢出整数,然后二进制文件可能会进入一个非常奇怪的状态。在这种情况下你也可能得到正确的值,但这有点纯粹的运气。另一方面,使用除法可避免整数溢出。