我有一种情况,性能非常重要。在我的算法的核心,有一种方法可以使用两个double
原语进行一些基本计算。每次运行该算法时,该方法被调用超过一千万次。
代码看起来像这样;
public int compare(double xA, double xB, double yA, double yB);
double x = xA * xB;
double y = yA * yB;
double diff = x - y;
return (diff < 0.0 ? -1 : (diff > 0.0 ? 1 : 0));
}
参数xA
并yA
从一组中获取它们的值。这个集合可以在代码中调整。我看到巨大的(大约两倍)性能差异取决于我放入集合中的值。似乎如果集合包含 a0.1
或 a 0.3
,则性能会受到很大影响。将集合保持为的倍数0.5
可获得最佳性能。
编译器是否优化x * 0.5
等x >> 1
?或者这是因为0.1
不能用二进制定义?
我想更好地了解这种情况,以便我可以优化它。我想这可能是一个相当困难的问题,除非有人确切知道 javac 和 jvm(在我们的例子中是热点)如何处理双乘法。