【发布时间】:2011-03-19 07:36:49
【问题描述】:
我使用以下函数计算整数的以 2 为底的对数:
public static int log2(int n){
if(n <= 0) throw new IllegalArgumentException();
return 31 - Integer.numberOfLeadingZeros(n);
}
它是否具有最佳性能?
有人知道为此目的准备好的 J2SE API 函数吗?
UPD1 令我惊讶的是,浮点运算似乎比整数运算更快。
UPD2 由于cmets我会进行更详细的调查。
UPD3 我的整数算术函数比 Math.log(n)/Math.log(2) 快 10 倍。
【问题讨论】:
-
你是如何测试这个性能的?在我的系统(Core i7,jdk 1.6 x64)上,整数版本几乎比浮点版本快 10 倍。请务必对函数的结果进行实际操作,以免 JIT 完全删除计算!
-
你是对的。我没有使用计算结果,编译器已经优化了一些东西。现在我的结果和你一样——整数函数快 10 倍(Core 2 Duo,jdk 1.6 c64)
-
这实际上给了你
Math.floor(Math.log(n)/Math.log(2)),所以它并不是真正计算以2为底的对数!
标签: java performance discrete-mathematics logarithm