首先声明,我并不想挑起争端。我想知道有没有好的资源可以比较C++和C#在数学密集型代码方面的表现?我的第一印象是C#应该会慢得多,但这只是我的主观感受,没有实际证据支持。我想知道是否有人做过相关的研究或测试?我计划自己进行一些测试,但希望知道是否有人以严谨的方式进行了此类测试(谷歌搜索结果很少)。谢谢。
编辑:我所指的密集型是指在紧密循环中大量使用sin/cos/exp等函数。
首先声明,我并不想挑起争端。我想知道有没有好的资源可以比较C++和C#在数学密集型代码方面的表现?我的第一印象是C#应该会慢得多,但这只是我的主观感受,没有实际证据支持。我想知道是否有人做过相关的研究或测试?我计划自己进行一些测试,但希望知道是否有人以严谨的方式进行了此类测试(谷歌搜索结果很少)。谢谢。
编辑:我所指的密集型是指在紧密循环中大量使用sin/cos/exp等函数。
C# 总体上会比较慢,但差别不是非常显著。在某些情况下,根据代码结构,C# 实际上可以更快,因为 JIT 分析经常可以提高长时间运行算法的性能。
编辑:这里有一篇很好的关于C#与C++性能的讨论
编辑2:
“总的来说”并不十分准确。正如您所说,JIT编译器实际上可以将MSIL编译成比C++编译器更快的本地代码,因为它可以针对正在运行的硬件进行优化。
然而,JIT编译本身是资源密集型的,并且在托管代码中会发生运行时检查。 预编译和预优化的代码将始终比仅 JIT 编译的代码更快。 每个基准测试比较都表明了这一点。但是,长时间运行的进程可能需要进行相当多的运行时分析,这可以改善优化过的本地代码。
因此,我所说的是100%准确的。对于一般情况,托管代码比预编译和预优化的代码稍慢。然而,对于某些情况,JIT分析可以提高性能,胜过预优化的本地代码。
作为我的工作的一部分,我需要定期比较各种语言和运行时下的核心数学性能。
在最近的一次测试中,在一个关键基准测试下——将由4D矩阵对长数组的4D向量进行变换并进行最终归一化的操作中——与我优化后的C++控制组相比,C#的表现约慢了30倍。在我的C++代码中,我可以获得每1.8ns处理一个向量的峰值吞吐量,而C#处理一个向量大约需要65ns的时间。
当然,这是一个特殊情况,而且C++代码并不是朴素的:它使用了软件管线、SIMD、缓存预取等全部微观优化技巧。
对于纯数学函数来说,问C#是否比C++更快并不是最好的问题。你应该问的是:
CLR JITer生成的汇编代码是否比C++编译器生成的汇编代码更有效率。
C#编译器对于纯数学运算的速度影响较小,而CLR JIT却有很大的影响。如果关闭溢出检查,它的性能几乎与其他.NET语言(如VB.Net)相同。
这里有广泛的基准测试:
http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=csharp&lang2=gpp&box=1
请注意,这里是将Mono JIT与C ++进行比较。据我所知,目前没有关于Microsoft实现的广泛基准测试,所以几乎所有你听到的都是道听途说。 :(我认为你问错了问题。你应该询问C++在数学计算方面是否可以击败.NET语言家族。看一下Runge Kutta的F#时间比较。
对于基本的数学库函数而言,C# 调用的是与 C++ 相同的编译代码,因此差异不大。但对于一些在数学库中没有找到的有趣数学问题,C# 会存在几个劣势。目前的 JIT 不支持 SSE 指令,而这是在 C++ 中可以使用的。