性能:log(a / b)vs log(a) - log(b)

时间:2015-01-23 15:18:20

标签: java performance

我想知道什么是更快的:

double value = Math.log(a) - Math.log(b);

double value = Math.log(a/b);

我计算value的方式是否会对性能产生影响(假设经常调用它)或者Java编译器是否为我优化了这个?

2 个答案:

答案 0 :(得分:3)

分析和测试总是一个好主意,但Math.log-/贵得多,所以Math.log(a/b)(调用Math.log原则上,它只会比Math.log(a) - Math.log(b)(调用它两次)更快。

  

我计算value的方式是否会对性能产生影响(假设经常调用它)或者Java编译器是否为我优化了这个?

编译器无法优化,不,因为这两个表达式不相等。 (数学上,ln a / b = ln a - ln b ,但这不一定适用于浮点数,因为它们不精确。当然,Math.log(-1) - Math.log(-1)NaN,使其与{{1}完全不同}。)

那就是说。 。 。你真的需要测试。即使这被大量调用,两个表达式之间的差异也许可以忽略不计,相比之下(比如)附近Math.log(-1 / -1)的成本几乎经常被调用。你的程序真的必须每秒​​运行这个表达式非凡的次,然后才能发现差异。

答案 1 :(得分:1)

我认为Math.log(a/b)更快。 为什么?

要解决.log(x),编译器首先会解析x的值,在这种情况下为a/b

因此,解决log的步骤将是:

  1. 解决x
  2. 解决a/b
    1. 解决a
    2. 解决b
  3. 返回a/b
  4. 返回log(a/b)
  5. 另一方面,日志的减法意味着Solve x 2次(a一次,b一次。然后你必须解决x-y xy正在进行.log()次操作。

    但是,Java可以为您优化所有这些。