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

Unexpected apparent performance difference between integer multiplication and division

本文关键字:性能 意外 除法 之间 整数      更新时间:2023-10-16

我正在实现一个简单的二进制搜索,以找到整数的平方根。代码运行正确。但是,如果我将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;
}

};

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

mid > (x / mid) 

比好

(mid * mid) > x

因为可以避免整数溢出。

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