当前位置:  开发笔记 > 编程语言 > 正文

C++和C#在数学上的性能差异

如何解决《C++和C#在数学上的性能差异》经验,为你挑选了6个好方法。

我想在此前言,我不是要开始一场战斗.我想知道是否有人有任何好的资源比较C++和C#的数学密集代码?我的直觉是C#应该明显变慢,但我真的没有证据表明这种感觉.我想知道这里有没有人参加过一项研究或者自己测试过这个问题?我打算自己运行一些测试,但是想知道是否有人以严格的方式完成了这项测试(google显示的很少).谢谢.

编辑:对于密集,我的意思是在紧密循环中发生了很多sin/cos/exp



1> Randolpho..:

一般来说C#会慢一些,但不是很明显.在某些情况下,根据代码的结构,C#实际上可以更快,因为JIT分析可以经常提高长期运行算法的性能.

编辑:这是对C#与C++性能的良好讨论

编辑2:

"总的来说"并不准确.正如您所说,JIT编译器实际上可以将您的MSIL转换为C++编译器的更快的本机代码,因为它可以针对其运行的硬件进行优化.

但是,您必须承认,JIT编译本身的行为是资源密集型的,并且托管代码中存在运行时检查.预编译和预优化代码总是比JITted代码更快.每个基准比较都显示出来.但是,可以通过预编译的,预优化的本机代码来改进可以进行大量运行时分析的长时间运行的进程.

所以我说的是100%准确.对于一般情况,托管代码比预编译的预优化代码稍慢.然而,它并不总是显着的性能损失,并且在某些情况下,JIT分析可以提高性能而不是预优化的本机代码.


当然,由于运行时检查会有一些惩罚...所以也许"一般"并没有误导:)
"总的来说"并不准确.正如您所说,JIT编译器实际上可以将您的MSIL转换为C++编译器的更快的本机代码,因为它可以针对其运行的硬件进行优化.
哦,实际上你是metnion"在某些情况下,JIT分析可以提高性能而不是预先优化的本机代码." 我同意:)这只是你之前的引用(我在上面提到过)似乎与此冲突.
那个"好讨论"就是垃圾(我是一名C++程序员).他正在使用std :: sort来对数据结构进行排序,实际上是通过引用来接受数组.而不是在C#中做同样的事情(当对象范围仅限于函数时,Java足够聪明地将调用转换为新的堆栈分配 - 我确信C#是相似的),他每次都要复制它然后表演很惊讶,表现很糟糕.如果你编写糟糕的代码,你的表现就会受到打击.
@Martin York:优化C++不是关于编译器开关/标志,而是关于编译器的功能和代码结构的更多信息.编译器只能以某种方式解释某些代码块; 例如,一个结构不良的循环不太可能被编译器展开.即使有提示,也无法保证内联.另一方面,JIT分析可以查看循环执行的历史记录并修改编译以展开它,或者选择内联比编译器内联的更大的方法.这会一直有效吗?不,但可能*是*.

2> Crashworks..:

作为我工作的一部分,我必须定期比较运行时和语言下核心数学的性能.

在我最近的测试中,C#与我的优化C++控制案例在关键基准测试下的表现 - 通过4d矩阵和最终标准化步骤 - C++对长4d矢量数组的转换比C#快约30倍.我可以在我的C++代码中每1.8ns获得一个向量的峰值吞吐量,而C#在每个向量中完成约65ns的工作.

这当然是一个专门的案例,C++并不天真:它使用软件流水线,SIMD,缓存预取,整个9码的微优化.


很高兴能提供帮助,但请记住,我在这里引用了一个特定的案例 - 一种特殊的线性代数,我将C#'JIT输出与我精心手工优化和近似汇编的C++进行比较.

3> JaredPar..:

对于直接的数学函数,询问C#是否比C++更快并不是最好的问题.你应该问什么

CLR JITer生成的程序集是否比C++编译器生成的程序集效率更高或更低

与CLR JIT相比,C#编译器对纯数学运算的速度影响要小得多.它的性能几乎与其他.Net语言(例如VB.Net,如果你关闭溢出加密)相同.



4> joemoe..:

这里有广泛的基准:

http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=csharp&lang2=gpp&box=1

注意,这将Mono JIT与C++进行比较.AFIAK没有广泛的微软实施基准,所以你几乎听到的一切都是道听途说.:(



5> wheaties..:

我想你问的是错误的问题.您应该问C++是否可以在数学计算中击败.NET系列语言.对Runge Kutta的 F#计时比较有一个雄心壮志



6> Henk Holterm..:

你没有很好地定义"数学密集"(低估:完全没有).

试图细分:

对于基本的Sin/Cos/Log函数,我不会期望太大的区别.

对于线性代数(矩阵),我希望.NET松散,对数组的(总是强制执行的)边界检查仅在某些情况下进行优化.

您可能需要对您的目标域附近的某些内容进行基准测试.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有