作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 Java 方法,它在一个非常紧凑的循环中重复计算以下表达式,并有大量重复:
Math.abs(a - b) - Math.abs(c - d)
a
、b
、c
和 d
是 long
值,可以跨越他们类型的整个范围。它们在每次循环迭代中都是不同的,并且它们不满足我所知道的任何不变量。
探查器表明处理器时间的很大一部分花在了这个方法上。虽然我将首先寻求其他优化途径,但我想知道是否有更智能的方法来计算上述表达式。
除了手动内联 Math.abs()
调用以获得非常轻微的(如果有的话)性能增益外,是否有任何数学技巧可用于加速此表达式的计算?
最佳答案
我怀疑探查器没有给你一个真实的结果,因为它试图分析(并因此增加了开销)这样一个微不足道的“方法”。如果没有配置文件,Math.abs 可以变成少量的机器代码指令,您将无法让它变得比这更快。
我建议您做一个微基准测试来确认这一点。我预计加载数据的成本会高出一个数量级。
long a = 10, b = 6, c = -2, d = 3;
int runs = 1000 * 1000 * 1000;
long start = System.nanoTime();
for (int i = 0; i < runs; i += 2) {
long r = Math.abs(i - a) - Math.abs(c - i);
long r2 = Math.abs(i - b) - Math.abs(d - i);
if (r + r2 < Integer.MIN_VALUE) throw new AssertionError();
}
long time = System.nanoTime() - start;
System.out.printf("Took an average of %.1f ns per abs-abs. %n", (double) time / runs);
打印
Took an average of 0.9 ns per abs-abs.
关于java - Math.abs(a - b) - Math.abs(c - d) 的更快实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924731/
我是一名优秀的程序员,十分优秀!