Java 更快地实现Math.round?
这段代码似乎是Java 更快地实现Math.round?,java,math,rounding,micro-optimization,Java,Math,Rounding,Micro Optimization,这段代码似乎是java.lang.Math.round的更快(和正确)版本,它有什么缺点吗 public static long round(double d) { if (d > 0) { return (long) (d + 0.5d); } else { return (long) (d - 0.5d); } } 它利用了这样一个事实,即在Java中,将长循环截断为零;您没有考虑下溢或溢出。实际上,这对您的应用程序可能并不重
java.lang.Math.round
的更快(和正确)版本,它有什么缺点吗
public static long round(double d) {
if (d > 0) {
return (long) (d + 0.5d);
} else {
return (long) (d - 0.5d);
}
}
它利用了这样一个事实,即在Java中,将长循环截断为零;您没有考虑下溢或溢出。实际上,这对您的应用程序可能并不重要。有些是内置方法处理的,而您的代码不处理。从文件中:
- 如果参数为
,则结果为0NaN
- 如果参数为负无穷大或任何小于或等于
的值,则结果等于Integer.MIN_value
的值Integer.MIN_value
- 如果参数为正无穷大或任何大于或的值
等于
,结果等于Integer.MAX_值
Integer.MAX_值
Math.round()
实现“向上取整一半”规则,而round()
方法实现“向上取整一半”规则
例如:
=>Math.round(-0.5d)
0L
=>你的.round(-0.5d)
-1L
Math.round()
另一个相关问题:
至于性能,毫无疑问,上述方法明显快于Math.round()
——对于随机生成的正值和负值,其运行时间约为35%。当在紧密循环中调用此方法时,这可能是一个值得的优化。当只给出正值时,它甚至更好(运行时的25%),可能是因为CPU使用
Math.round()
最终由本机JNI调用实现,这可能是性能差异的原因。表明j6u22中可能有纯Java版本,但我看不出在哪里,而且j6u23中的Math.round()
在我的测试中的性能与j6u16类似。我还没有在其他版本上测试过。@TrueWill:如果它整齐地位于一个正确命名的函数中。。。这真的重要吗?也许它正被用于数学密集型程序中。对于自1.0以来一直存在的一种方法,在保持与原始方法100%的一致性的情况下,很少有人能找到一种速度明显更快的方法。这绝对是一种微观优化,在局部意义上是值得的。-但这些都不推荐用于一般用途。这不是一个毫无意义的优化。我有一个很大程度上依赖于数学的算法。round
,这对我帮助很大。谢谢