我想在此前言,我不是要开始一场战斗.我想知道是否有人有任何好的资源比较C++和C#的数学密集代码?我的直觉是C#应该明显变慢,但我真的没有证据表明这种感觉.我想知道这里有没有人参加过一项研究或者自己测试过这个问题?我打算自己运行一些测试,但是想知道是否有人以严格的方式完成了这项测试(google显示的很少).谢谢.
编辑:对于密集,我的意思是在紧密循环中发生了很多sin/cos/exp
一般来说C#会慢一些,但不是很明显.在某些情况下,根据代码的结构,C#实际上可以更快,因为JIT分析可以经常提高长期运行算法的性能.
编辑:这是对C#与C++性能的良好讨论
编辑2:
"总的来说"并不准确.正如您所说,JIT编译器实际上可以将您的MSIL转换为C++编译器的更快的本机代码,因为它可以针对其运行的硬件进行优化.
但是,您必须承认,JIT编译本身的行为是资源密集型的,并且托管代码中存在运行时检查.预编译和预优化代码总是比JITted代码更快.每个基准比较都显示出来.但是,可以通过预编译的,预优化的本机代码来改进可以进行大量运行时分析的长时间运行的进程.
所以我说的是100%准确.对于一般情况,托管代码比预编译的预优化代码稍慢.然而,它并不总是显着的性能损失,并且在某些情况下,JIT分析可以提高性能而不是预优化的本机代码.
作为我工作的一部分,我必须定期比较运行时和语言下核心数学的性能.
在我最近的测试中,C#与我的优化C++控制案例在关键基准测试下的表现 - 通过4d矩阵和最终标准化步骤 - C++对长4d矢量数组的转换比C#快约30倍.我可以在我的C++代码中每1.8ns获得一个向量的峰值吞吐量,而C#在每个向量中完成约65ns的工作.
这当然是一个专门的案例,C++并不天真:它使用软件流水线,SIMD,缓存预取,整个9码的微优化.
对于直接的数学函数,询问C#是否比C++更快并不是最好的问题.你应该问什么
CLR JITer生成的程序集是否比C++编译器生成的程序集效率更高或更低
与CLR JIT相比,C#编译器对纯数学运算的速度影响要小得多.它的性能几乎与其他.Net语言(例如VB.Net,如果你关闭溢出加密)相同.
这里有广泛的基准:
http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=csharp&lang2=gpp&box=1
注意,这将Mono JIT与C++进行比较.AFIAK没有广泛的微软实施基准,所以你几乎听到的一切都是道听途说.:(
我想你问的是错误的问题.您应该问C++是否可以在数学计算中击败.NET系列语言.对Runge Kutta的 F#计时比较有一个雄心壮志
你没有很好地定义"数学密集"(低估:完全没有).
试图细分:
对于基本的Sin/Cos/Log函数,我不会期望太大的区别.
对于线性代数(矩阵),我希望.NET松散,对数组的(总是强制执行的)边界检查仅在某些情况下进行优化.
您可能需要对您的目标域附近的某些内容进行基准测试.