我正在测试一些平方根算法,直到我发现第一种方法比第二种方法快
@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 Home
-英特尔酷睿I7-7700HQ@2.80GHz
-16GB RAM
答案 0 :(得分:1)
第一个仅循环15次。第二个循环16次。因此,您减少了一个增量,然后在第一个中进行比较。我可以想象,如果只重复计算16次而不使用循环,它将使速度更快。但这只是预感。