在Java中,Log和Log10之间是否存在性能差异?

6
我曾在不同的程序中看到过使用Log10(x)Log(x)/Log(10)来计算以10为底的对数。有没有什么关于它们实现的东西,使得取两个自然对数比取一个以10为底的对数更具性能或等效?如果所需的底在编译时已知,则第二个方法似乎是浪费的。

你从哪里得到这些函数的?我认为这可能是实现特定的,因为 Log10(x) 可能是 function Log10(int x) { return Log(x) / Log(10); } - Zymus
1
在JSE中已经有Math.log10(x)了。它可以使代码更加清晰简洁。无论如何,微小的优化并不值得。 - PeterMmm
@Zymus 没有。loglog10两种方法都调用本地方法。 - Luiggi Mendoza
在我的分析中,log(x) 似乎比 log10(x) 快一点;log10(x)log(x)/const 快一点。 - ZhongYu
1个回答

7
你应该使用log10,它实际上调用了一个本地函数(即它不是在Java中实现的--参见StrictMath.log10)。log(x)/log(10)可能被那些不知道log10的人使用。你几乎肯定不会注意到这两种变体之间的性能差异。 log10(x)清楚地传达了你的意图,而log(x)/log(10)则不够清晰,不能明确你真正想要的是以10为底的对数。

使用不必要的底数转换可能会导致效率低下。 - Ricky Mutschlechner
这是Math#log(double d)的[源代码](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/Math.java),这是[StrictMath#log](http://hg. openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/StrictMath.java)的源代码。我正在搜索它们以提供答案。 - Luiggi Mendoza
这句话有点措辞强硬:“你几乎肯定不会注意到两种变体之间的性能差异。” 这当然对于单个日志是正确的,但某些代码可能会得到许多日志。其中一种变体需要一个本地调用,而另一种变体需要两个本地调用。假设在调用多次时会产生可观察的差异? - Andy Thomas
似乎存在明显的性能差异,约为1纳秒。 - ZhongYu
@bayou.io 这种差异可能只是由于您的计算机在测试之间的 CPU 使用率发生了变化。 - user4157653
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接