Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更快地实现Math.round?_Java_Math_Rounding_Micro Optimization - Fatal编程技术网

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中,将长循环截断为零;您没有考虑下溢或溢出。实际上,这对您的应用程序可能并不重要。

有些是内置方法处理的,而您的代码不处理。从文件中:

  • 如果参数为
    NaN
    ,则结果为0
  • 如果参数为负无穷大或任何小于或等于
    Integer.MIN_value
    的值,则结果等于
    Integer.MIN_value
    的值
  • 如果参数为正无穷大或任何大于或的值 等于
    Integer.MAX_值
    ,结果等于
    Integer.MAX_值

我已经对此进行了测试,这里还没有描述一个关键的潜在缺点:您正在更改方法

Math.round()
实现“向上取整一半”规则,而
round()
方法实现“向上取整一半”规则

例如:

  • Math.round(-0.5d)
    =>
    0L
  • 你的.round(-0.5d)
    =>
    -1L
这对您来说可能是问题,也可能不是问题,但您应该了解,即使在已经概述了NaN和无穷大注意事项之后,上述方法也不能替代
Math.round()

另一个相关问题:

至于性能,毫无疑问,上述方法明显快于
Math.round()
——对于随机生成的正值和负值,其运行时间约为35%。当在紧密循环中调用此方法时,这可能是一个值得的优化。当只给出正值时,它甚至更好(运行时的25%),可能是因为CPU使用


Math.round()
最终由本机JNI调用实现,这可能是性能差异的原因。表明j6u22中可能有纯Java版本,但我看不出在哪里,而且j6u23中的
Math.round()
在我的测试中的性能与j6u16类似。我还没有在其他版本上测试过。

@TrueWill:如果它整齐地位于一个正确命名的函数中。。。这真的重要吗?也许它正被用于数学密集型程序中。对于自1.0以来一直存在的一种方法,在保持与原始方法100%的一致性的情况下,很少有人能找到一种速度明显更快的方法。这绝对是一种微观优化,在局部意义上是值得的。-但这些都不推荐用于一般用途。这不是一个毫无意义的优化。我有一个很大程度上依赖于
数学的算法。round
,这对我帮助很大。谢谢