首页 > 解决方案 > 为什么第一个 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 内存

标签: javaalgorithmsqrtjmh

解决方案


第一个只循环 15 次。第二个循环 16 次。所以你少做一个增量并在第一个中进行比较。我想如果你只是重复计算 16 次而不使用循环,它会加快速度。但这只是一种预感。


推荐阅读