我有一种情况,性能是非常重要的。在我的算法的核心,有一个方法可以用两个基本元素进行一些基本的计算。该算法在每次运行中被称为超过一千万次。Java IEEE 64位754双倍值,以避免
代码看起来像这样;
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
采取从一组其值。这个集合可以在代码中调整。我看到了巨大的(大约两倍)性能差异,这取决于我放入该组的价值。看起来如果该集合包含0.1
或0.3
,则表现会受到重创。保持设置为0.5
的倍数可以获得最佳性能。
编译器是否优化x * 0.5
为x >> 1
等?或者这是因为0.1
无法在二进制文件中定义?
我想更好地了解这种情况,以便我可以优化这一点。我想这可能是一个相当难的问题,除非有人确切地知道javac和jvm(在我们的例子中是热点)如何处理双重乘法。
您确定性能差异直接在此例程中,而不是更改xA和yA导致返回不同结果的结果,从而更改此例程返回后执行的内容? – 2012-08-01 18:54:56
您可以通过删除该行并用'return x y?替换返回来消除减法。 1:0;'。 –
2012-08-01 18:57:02
如果可用的调整延伸到可以用p/q和1代替xA和yA的值p和q,那么可以消除乘法,从而留下'double x = xA * xB; double y = yB;'(取决于通常的浮点舍入问题)。 – 2012-08-01 18:59:40