整数乘法和除法之间意外的明显性能差异
Unexpected apparent performance difference between integer multiplication and division
我正在实现一个简单的二进制搜索,以找到整数的平方根。代码运行正确。但是,如果我将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
可能溢出整数,然后二进制可能进入非常奇怪的状态。在这种情况下,你可能会得到正确的值,但这在某种程度上纯粹是运气。另一方面,使用除法可以避免整数溢出。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 在C++中对T*类型执行std::move的意外行为
- 大小相等但成员数量不同的结构之间的性能差异
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么constexpr的性能比正常表达式差
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 在类中使用随机生成器时出现性能问题
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 海湾合作委员会 ARM 性能下降
- 在X64模式下从C /CLI调用MASM PROC会产生意外的性能问题
- C++:使用更大的比较器意外提升性能
- 整数乘法和除法之间意外的明显性能差异