【发布时间】:2011-03-14 20:29:22
【问题描述】:
我不太明白是什么让 C#/.NET(甚至 Java)中的矩阵乘法如此缓慢。
看看这个基准(source):试图找到一个更新的基准。
C# 的整数和双精度性能非常接近使用 MSVC++ 编译的 C++。双精度的 87% 和 32 位整数的 99%。相当不错,我会说。但是再看看矩阵乘法。差距扩大到 C# 的速度大约是 19%。这是一个相当大的差异,我不明白。矩阵乘法只是一堆简单的数学运算。怎么变得这么慢?它不应该与等量的简单浮点或整数运算大致一样快吗?
这对于游戏和 XNA 来说尤其值得关注,其中矩阵和矢量性能对于物理引擎等事物至关重要。前段时间,Mono 通过一些漂亮的向量和矩阵类增加了对 SIMD 指令的支持。它缩小了差距,使 Mono 比手写 C++ 更快,尽管不如带有 SIMD 的 C++ 快。 (source)
这是怎么回事?
编辑:仔细看,我误读了第二张图。 C# 看起来非常接近。 第一个基准测试只是做错了什么吗?抱歉,我错过了第一个基准测试的版本号。我把它作为我一直听到的“C# 线性代数很慢”的方便参考。我会尝试再找一个。
【问题讨论】:
-
C# 版本 + 选项:.Net Framework 1.1.4322 呃...没有更新的版本吗?
-
坐着等着看 JonSkeet 对此事的看法 :-)
-
测试是用 VS 2003 完成的。(注意 C++ 版本也是如此。)因此是 .net 的古老版本。
-
@GalacticJello 是的,但即使如此,为什么它比整数/浮点运算慢得多?我会看看能不能找到更多的基准。
-
@Matt Olenick:那是 .NET 的第一个(嗯……第二个)版本。此外,XNA 甚至不能在 .NET 1.1 上运行,它是 .NET 2.0 精简版的实现。信不信由你,在早期版本之后,语言得到了改进。
标签: c# .net performance xna matrix-multiplication