OpenTK
库以及 MonoTouch 和 MonoDroid 包含方法 LengthFast
,它应该在不使用 Math.Sqrt
的情况下计算向量长度的近似值(这似乎被称为慢)。 LengthFast
用途 MathHelper.InverseSqrtFast
,一种非常有趣的方法,它应该给出平方根的快速近似值(参见 http://www.opentk.com/files/doc/_math_helper_8cs_source.html 的第 172 和 196 行)。
我创建了一个小基准,它调用两个计算 100'000'000
次,向量长度在 1 到 100 之间。
在 Windows 7/Intel i7-2600 3.40 GHz 上,我得到:Length
:2947 ms
LengthFast
:4754 ms
在带有 MonoTouch 的 iPad 3 上,我得到:Length
:51575 ms
LengthFast
:41252 ms
所以,LengthFast
在 Intel CPU 上速度要慢得多,在 iPad 的 ARM 上它稍微快一点。
对此有什么解释吗? 这是英特尔 CPU 能够“本地”计算平方根(不使用软件近似)的结果吗?不应该LengthFast
总是更快,至少快一点?
最佳答案
全部 Math
成员(member)真的很快。不要试图加速 .NET 数学代码。在 ARM 处理器上它可能更快,因为在 ARM 处理器上执行相同的实现需要一些缺少的 X86/X86_64 命令,因此代码不同。
关于.net - OpenTK 的 Vector2.Length 是 Vector2.LengthFast 的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13424546/