java - 为什么第一个 sqrt 算法比第二个更快?
问题描述
我正在测试一些平方根算法,直到我注意到第一种方法比第二种方法快
@Benchmark
@Fork(value = 1)
@BenchmarkMode(Mode.Throughput)
public void sqrt1() {
int number = 25 << 10;
int result = sqrt1(number);
}
@Benchmark
@Fork(value = 1)
@BenchmarkMode(Mode.Throughput)
public void sqrt2() {
int number = 25 << 10;
int result = sqrt2(number);
}
public static int sqrt1(int number) {
number >>= 10;
int c = 0x8000;
int g = 0x8000;
if (g * g > number) {
g ^= c;
}
c >>= 1;
if (c == 0) {
return g << 10;
}
g |= c;
for (int i = 0; i < 15; i++) {
if (g * g > number) {
g ^= c;
}
c >>= 1;
if (c == 0) {
return g << 10;
}
g |= c;
}
return g << 10;
}
public static int sqrt2(int number) {
number >>= 10;
int c = 0x8000;
int g = 0x8000;
for (int i = 0; i < 16; i++) {
if (g * g > number) {
g ^= c;
}
c >>= 1;
if (c == 0) {
return g << 10;
}
g |= c;
}
return g << 10;
}
基准测试结果
Benchmark Mode Cnt Score Error Units
Benchmarks.sqrt1 thrpt 20 104918275,263 ± 1080520,157 ops/s
Benchmarks.sqrt2 thrpt 20 93597198,803 ± 417763,363 ops/s
为什么第一种方法比第二种方法快?
使用 jhm 和 java 8 完成的基准测试
-Windows 10 家庭版
-英特尔酷睿 I7-7700HQ@2.80GHz
-16GB 内存
解决方案
第一个只循环 15 次。第二个循环 16 次。所以你少做一个增量并在第一个中进行比较。我想如果你只是重复计算 16 次而不使用循环,它会加快速度。但这只是一种预感。
推荐阅读
- c# - 创建目录并允许写访问 C# .NET Core
- c# - Wcf 将整数值设置为默认值
- python - python从字典中写入csv,同时删除列表括号
- python - 以毫秒为单位将时间转换回时间戳 Python?
- regex - 你能帮我用一个正则表达式来匹配 1 个字符串中的 2 个不同部分作为一个组吗
- amazon-web-services - 权限被拒绝:'/home/ugurkaya/.aws/credentials'
- reactjs - 无法使用 React 和 react-i18next 读取未定义的属性选项
- html - Chartjs 和 Angular 5 上的错误 - “无法从给定项目获取上下文”
- swift - MTLDevice.makeBuffer(bytes:length:options:) 上的金属裂缝
- nuget - 管理应用程序打包和更新的解决方案?