我想知道什么是更快的:
double value = Math.log(a) - Math.log(b);
或
double value = Math.log(a/b);
我计算value
的方式是否会对性能产生影响(假设经常调用它)或者Java编译器是否为我优化了这个?
答案 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
的步骤将是:
x
a/b
a
b
a/b
log(a/b)
另一方面,日志的减法意味着Solve x
2次(a
一次,b
一次。然后你必须解决x-y
x
和y
正在进行.log()
次操作。
但是,Java可以为您优化所有这些。