【发布时间】:2013-10-29 10:38:46
【问题描述】:
Math.abs(x) 的正常实现(由 Oracle 实现)由下式给出
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
将数字符号的一位编码设置为零(或一)不是更快吗? 我想只有一位编码数字的符号,并且总是相同的位,但我可能错了。
或者我们的计算机通常不适合使用原子指令对单个位进行操作?
如果可以实现更快的实现,你能给它吗?
编辑:
有人向我指出,Java 代码是独立于平台的,因此它不能依赖于单台机器的原子指令。然而,为了优化代码,JVM 热点优化器确实会考虑机器的具体情况,并且可能会应用正在考虑的优化。
然而,通过一个简单的测试,我发现至少在我的机器上,Math.abs 函数似乎没有针对单个原子指令进行优化。我的代码如下:
long before = System.currentTimeMillis();
int o = 0;
for (double i = 0; i<1000000000; i++)
if ((i-500)*(i-500)>((i-100)*2)*((i-100)*2)) // 4680 ms
o++;
System.out.println(o);
System.out.println("using multiplication: "+(System.currentTimeMillis()-before));
before = System.currentTimeMillis();
o = 0;
for (double i = 0; i<1000000000; i++)
if (Math.abs(i-500)>(Math.abs(i-100)*2)) // 4778 ms
o++;
System.out.println(o);
System.out.println("using Math.abs: "+(System.currentTimeMillis()-before));
这给了我以下输出:
234
using multiplication: 4985
234
using Math.abs: 5587
假设乘法是由原子指令执行的,似乎至少在我的机器上,JVM 热点优化器不会将 Math.abs 函数优化为单指令操作。
【问题讨论】:
-
使用 64 位 JVM 或
-server选项尝试您的基准测试。在我的机器上,abs比乘法快。 -
同上。我也做了测试。 abs 对我来说更快
标签: java bit-manipulation absolute-value