(int)Math.sqrt(n)比(int)Math.floor(Math.sqrt(n))慢很多

Pet*_*háč 5 java performance casting floor

我正在查看我的代码,希望提高其性能,然后我看到了这个:

int sqrt = (int) Math.floor(Math.sqrt(n));
Run Code Online (Sandbox Code Playgroud)

哦,好吧,我真的不需要调用Math.floor,因为从Math.sqrt(n)返回的强制转换也会有效地对数字进行拼接(因为sqrt永远不会返回负数).所以我去了Math.floor的电话:

int sqrt = (int) Math.sqrt(n)
Run Code Online (Sandbox Code Playgroud)

坐下来,自满地看着代码运行并执行大约10%!比以前的版本更糟糕.这令我感到震惊.任何人的想法?

Math.floor javadocs:"返回小于或等于参数且等于数学整数的最大(最接近正无穷大)double值."

在我的情况下编辑n很长.任何机会cast-floor-sqrt都会生成与cast-sqrt不同的int?我个人不明白为什么会这样......所有涉及的数字都是积极的.

mvi*_*fer 6

Math.floor方法只是将调用委托给StrictMath.floor方法(参见此处).此方法是本机方法.在此方法之后,强制转换不必执行任何操作,因为它已经是一个等于整数的数字(因此没有小数位).

也许底层的本机实现比将int值转换为double值更快.

  • 不要被源代码中的`java.lang.Math`中的方法看起来如此愚弄.JVM可能会在运行时通过内部函数(即CPU指令)替换所有这些函数. (2认同)