C#比C++慢吗?

85

我已经思考这个问题有一段时间了。

当然,在C#中有些东西并没有为速度做出优化,所以使用那些对象或语言调整(例如LinQ)可能会导致代码变慢。

但是,如果您不使用任何这些调整,而只是将同样的代码片段在C#和C++中进行比较(很容易将一个翻译为另一个),它真的会慢那么多吗?

我看到的比较表明,在某些情况下,C#可能会更快,因为理论上JIT编译器应该实时优化代码并获得更好的结果:

托管还是非托管?

我们应该记住,JIT编译器在实时编译代码,但这是一次性的开销,相同的代码(一旦到达和编译)不需要再次在运行时编译。

GC也不会增加太多额外的开销,除非您创建和销毁成千上万的对象(如使用String而不是StringBuilder)。在C++中这样做也将很昂贵。

我想提出的另一点是,在.NET中引入的DLL之间更好的通信方式。.Net平台比基于托管COM的DLL更好地进行通信。

我没有看到任何固有的原因说明为什么语言应该更慢,而且我真的认为C#不比C++慢(从经验和缺乏一个好的解释来看)。

那么,用C#编写的相同代码片段是否会比C++中的代码更慢? 如果是,那么为什么?

一些其他参考资料(虽然谈论了这个问题,但没有关于为什么的解释):

如果C++比C++慢,为什么要使用C#?


3
真的...这取决于...有些事情更快,有些事情更慢。C/C++更具“确定性”(没有垃圾收集器)。如果你想要创建100个线程,我可以告诉你,GC会以其缓慢的速度来困扰你(并且在告诉我100个线程太多之前,请知道Skype和McAfee AV现在在我的电脑上每个都有40个线程)...在C#中编组是很麻烦的(而且速度较慢)。编码相当快。不,这不是挑衅。我真正更喜欢C#。 - xanatos
1
我认为这个问题应该被编辑并重新开放。我认为提问者可能不理解一个更基本的问题影响了C#和像C或C++这样的语言之间的性能差异,即“由C编译器生成的代码(以及它如何执行)与由C#编译器生成的代码之间有什么区别?” C#/Java和其他解释型或VM语言在运行其字节码时可能有几个中间步骤,在等效的C程序中完全不存在。 - Jonathon Faust
3
虽然您可以争辩说(如所述),这符合“不是一个真正的问题”的定义,但声称这是主观的是没有意义的。 “A是否比B更快”是一件可以开放客观测量的事情。 即使通过这样的测量得到的答案是含糊的(有些东西在一个方面更快,而在另一个方面更快),它仍然是客观的。 - Jerry Coffin
1
请参阅计算机语言基准测试,对许多不同类型的问题进行全面比较。 - Assaf Lavie
使用C++并不能自动产生更快的程序。C++可以让你更好地控制程序的性能特征,从而使你能够编写更快的程序,但这需要付出很多努力。 - Ferruccio
显示剩余6条评论
12个回答

0

主要关注点不是速度,而是在Windows版本和升级之间的稳定性。Win32在Windows版本之间基本上免疫,因此非常稳定。

当服务器被停用并且软件迁移时,任何使用.Net的东西通常会引起很多焦虑,通常会对.Net版本感到恐慌,但是10年前构建的Win32应用程序仍然像没发生过任何事情一样运行。


0

不要让自己感到困惑!

  • 如果一个C#应用程序和一个C++应用程序都是在最佳情况下编写的,那么C++会更快。
    有很多原因可以解释为什么C++天生比C#更快,例如C#使用类似于Java中JVM的虚拟机。基本上,高级语言的性能较低(如果在最佳情况下使用)。

  • 如果您像一名经验丰富的专业C++程序员一样熟练掌握C#,那么使用C#开发应用程序比使用C++更容易、更快速。

还有许多其他情况可能存在。例如,您可以编写一个C#应用程序和一个C++应用程序,使得C#应用程序比C++应用程序运行得更快。

选择一种语言时,应注意项目及其主题的情况。对于一般的商业项目,应使用C#。对于需要高性能的项目,如视频转换或图像处理项目,应选择C++。

更新:

好的,让我们比较一些关于为什么C++的最大可能速度比C#更快的实际原因。考虑一个良好编写的C#应用程序和同样的C++版本:

  • C#使用虚拟机作为执行应用程序的中间层。这会带来一定的开销。
  • 据我所知,CLR无法优化目标机器上的所有C#代码。而C++应用程序可以在目标机器上编译出最优化的代码。
  • 在C#中,运行时最可能的优化意味着使用最快的虚拟机。但是虚拟机总会有一定的开销。
  • C#是一种高级语言,因此它会为最终处理生成更多的程序代码行数。(考虑汇编应用程序和Ruby应用程序之间的差异!同样的情况也存在于C++和像C#/Java这样的高级语言之间)

如果您想要作为专家获取更多实践信息,请查看此链接。它是关于Java的,但同样适用于C#。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接