快速方形双倍

Sam*_*uel 18 java math performance multiplication

我正在寻找最方便的方法(double d).到目前为止,我提出了两种方法:

1. d*d
2. Math.pow(d, 2)
Run Code Online (Sandbox Code Playgroud)

为了测试性能,我设置了三个测试用例,在每个测试用例中,我使用相同的种子为三种情况生成随机数,然后只计算循环100 000 000次的平方数.

在第一个测试案例中,使用random.nextDouble()第二种情况下使用random.nextDouble()*Double.MAX_VALUE和使用第三种 情况生成数字random.nextDouble()*Double.MIN_VALUE.

几次运行的结果(近似结果,总是有一些变化,使用java 1.8运行,在Mac OSX Mavericks上为java 1.6编译)

Approach | Case 1 | Case 2 | Case 3
---------•--------•--------•-------
    1    | ~2.16s | ~2.16s | ~2.16s
    2    | ~9s    | ~30s   | ~60s
Run Code Online (Sandbox Code Playgroud)

结论似乎是方法1更快,但Math.pow似乎表现得有些奇怪.

所以我有两个问题:

1为什么Math.pow这么慢,为什么它会对数字造成严重影响> 1甚至更糟< -1

2有没有办法提高性能超过我建议的方法1?我在考虑这样的事情:

long l = Double.doubleToRawLongBits(d);
long sign = (l & (1 << 63));
Double.longBitsToDouble((l<<1)&sign);
Run Code Online (Sandbox Code Playgroud)

但这是a)错误,和b)与方法1的速度相同.

Ell*_*sch 10

对数字进行平方的最快方法是将其自身相乘.

为什么Math.pow这么慢?

它实际上不是,但它正在执行取幂而不是简单的乘法.

为什么它会严重处理> 1,甚至更差,<-1数

首先,因为它做了数学.从Javadoc它还包含许多极端情况的测试.最后,我不会过分依赖你的微观基准.


Dur*_*dal 6

通过与自身相乘来平方是最快的.因为approch可以直接转换为简单的非分支字节码(因此,间接地,机器代码).

Math.pow()是一个非常复杂的函数,它为边缘情况提供了各种保证.它需要被调用而不是内联.