距离平方与距离的实际性能优势
Actual performance benefits of distance squared vs distance
在 Java 中计算两个 3D 点之间的距离时,我可以计算距离,或者它们之间的距离平方,避免调用 Math.sqrt。
自然地,我读到 sqrt 只是乘法速度的四分之一,这使得使用距离平方的不便变得不值得。
在Java中,乘法和计算平方根的绝对性能差异是多少?
我最初想将此添加为评论,但它开始出价太高,所以这里是:
自己试试吧。制作一个包含 10.000 次迭代的循环,您只需在其中计算 a*a + b*b
,并在另一个单独的循环中计算 Math.sqrt(a*a + b*a)
。时间它,你就会知道。计算 square root
本身就是一个迭代过程,其中数字(计算机位)平方根收敛到更接近给定数字的实平方根,直到足够接近(只要每次迭代之间的差异小于一些非常小的价值)。除了 Math
库使用的算法之外,还有多种算法,它们的速度取决于输入和算法的设计方式。在我看来,坚持使用 Math.sqrt(...)
,不会出错,并且已经过很多人的测试。
虽然这对于一个平方根可以非常快地完成,但存在明显的可观察时间差异。
旁注:我想不出不止一次计算平方根的理由,通常是在最后。如果您想知道点之间的距离,只需使用该距离的平方值作为默认值,然后根据该默认值制作 comparisons/summations/subtractions 或任何您想要的值。
PS:如果您想要更多 "practical" 答案,请提供更多代码
在 Java 中计算两个 3D 点之间的距离时,我可以计算距离,或者它们之间的距离平方,避免调用 Math.sqrt。
自然地,我读到 sqrt 只是乘法速度的四分之一,这使得使用距离平方的不便变得不值得。
在Java中,乘法和计算平方根的绝对性能差异是多少?
我最初想将此添加为评论,但它开始出价太高,所以这里是:
自己试试吧。制作一个包含 10.000 次迭代的循环,您只需在其中计算 a*a + b*b
,并在另一个单独的循环中计算 Math.sqrt(a*a + b*a)
。时间它,你就会知道。计算 square root
本身就是一个迭代过程,其中数字(计算机位)平方根收敛到更接近给定数字的实平方根,直到足够接近(只要每次迭代之间的差异小于一些非常小的价值)。除了 Math
库使用的算法之外,还有多种算法,它们的速度取决于输入和算法的设计方式。在我看来,坚持使用 Math.sqrt(...)
,不会出错,并且已经过很多人的测试。
虽然这对于一个平方根可以非常快地完成,但存在明显的可观察时间差异。
旁注:我想不出不止一次计算平方根的理由,通常是在最后。如果您想知道点之间的距离,只需使用该距离的平方值作为默认值,然后根据该默认值制作 comparisons/summations/subtractions 或任何您想要的值。
PS:如果您想要更多 "practical" 答案,请提供更多代码