【问题标题】:Performance: log(a/b) vs. log(a) - log(b)性能:log(a/b) 与 log(a) - log(b)
【发布时间】:2015-03-22 16:10:26
【问题描述】:

我想知道什么更快:

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

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

我计算 value 的方式会不会影响性能(假设它经常被调用)还是 Java 编译器会为我优化?

【问题讨论】:

  • 有一个【C++相关问题】(也有stackoverflow.com/questions/2858483/…
  • 在这里仔细考虑上下文;有许多问题最好在整个日志空间中工作。如果是单个实例,我会去划分。
  • 为什么不直接测试一下?
  • 这里很难谈论对性能的影响,因为我们谈论的是可能在 FPU 而不是 CPU 上进行的操作......这也很难说
  • @DavidMerinos 啊,你想要理论上正确的答案而不是实际正确的答案?

标签: java performance


【解决方案1】:

分析和测试总是一个好主意,但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,与 Math.log(-1 / -1) 完全不同。)

那就是说。 . .你真的需要测试。即使这被调用了很多,这两个表达式之间的差异可能会被证明可以忽略不计(比方说)附近的 println 的成本几乎同样频繁地被调用。在您期望观察到差异之前,您的程序确实必须每秒运行此表达式 非常 次。

【讨论】:

  • 感谢您的解释!
【解决方案2】:

我认为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)

另一方面,日志的减法将意味着Solve x 2 次(一次用于a,一次用于b。然后您必须将x-y 解析为xy正在.log() 操作。

不过,Java 可以为您优化这一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2011-04-27
    • 2010-12-21
    • 2021-10-06
    • 1970-01-01
    • 2011-10-20
    • 2021-03-02
    相关资源
    最近更新 更多