5

这些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 上,我得到:

Length2947 ms

LengthFast4754 ms

在带有 MonoTouch 的 iPad 3 上,我得到:

Length51575 ms

LengthFast41252 ms

因此,LengthFast在 Intel CPU 上要慢得多,在 iPad 的 ARM 上要快一些。

对此有何解释?这是英特尔 CPU 能够“本机”计算平方根(不使用软件近似)的结果吗?不LengthFast应该总是更快,至少一点点?

4

2 回答 2

3

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

于 2012-11-17T12:32:37.133 回答
1

如果您查看它的来源,它与Quake 3LengthFast中的基本相同。

该算法针对 x86 指令进行了优化,而不是针对 ARM 指令进行了优化。据记载,这种算法在 ARM 上实际上要慢一些:

http://omcfadde.blogspot.com/2011/02/math-function-micro-optimization.html

很明显可以看出,这种微优化对于 x86 和 x86_64 来说是非常好的。不要在 ARM 上尝试;它比仅仅在 1.0 / sqrt(x) 上受到打击要慢得多

编辑

原来我是倒着读的……可能是 JIT 弄乱了你的时间。在进入定时循环之前尝试调用LengthandLengthFast一次,以确保方法和MathHelper类都被初始化和 JITted。它不应该有那么大的不同,但它是一个起点。MonoTouch 没有 JIT,所以它仍然是一个因素。

于 2012-11-16T21:30:11.737 回答