OpenTK的Vector2.Length是Vector2.LengthFast的两倍

che*_*ica 5 .net sqrt xamarin.ios opentk

这些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在英特尔CPU上慢得多,在iPad的ARM上它稍快一些.

对此有何解释?这是因为英特尔CPU能够"本地"计算平方根(不使用软件近似值)吗?不LengthFast应该总是更快,至少一点点?

Fel*_* K. 3

所有Math成员都非常快。不要尝试加速 .NET 数学代码。在 ARM 处理器上,它可能会更快,因为缺少一些在 ARM 处理器上实现相同实现所需的 X86/X86_64 命令,因此代码不同。