C#真的比说C ++慢吗?

时间:2011-03-16 13:49:46

标签: c# c++ performance

我一直想知道这个问题。

当然,C#中的某些内容并未针对速度进行优化,因此使用这些对象或语言调整(如LinQ)可能会导致代码变慢。

但是如果你不使用任何这些调整,只是比较C#和C ++中相同的代码片段(很容易将它们翻译成另一个)。它真的会慢得多吗?

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

Managed Or Unmanaged?

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

除非你创建和销毁数以千计的对象(比如使用String而不是StringBuilder),否则GC不会增加很多开销。用C ++做这件事也很昂贵。

我想提出的另一点是.Net中引入的DLL之间的更好的通信。 .Net平台的通信比基于托管COM的DLL要好得多。

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

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

其他一些参考文献(关于这一点,但没有解释为什么):

Why would you want to use C# if its slower than C++?

12 个答案:

答案 0 :(得分:134)

答案 1 :(得分:38)

因为你并不总是需要使用(我使用这种松散的)“最快”的语言?我不开车在法拉利工作只是因为它更快......

答案 2 :(得分:15)

C ++始终具有性能优势。使用C#,我无法处理内存,而且我可以使用大量资源来完成我的工作。

您需要提出的问题更多的是关于哪一个可以节省您的时间。机器现在非常强大,你的大部分代码都应该用一种语言来完成,这样你就可以在最短的时间内获得最大的价值。

如果在C#中存在花费太长时间的核心处理,那么您可以构建一个C ++并使用C#互相转换。

不要考虑代码性能。开始建立价值。

答案 3 :(得分:14)

大约2005年,来自原生/管理围栏双方的两名MS表现专家试图回答同样的问题。他们的方法和过程仍然令人着迷,今天的结论仍然存在 - 我并不知道有任何更好的尝试给出明智的答案。他们指出,讨论潜在原因的绩效差异是假设和徒劳的,真正的讨论必须有一些经验基础来解决这些差异对现实世界的影响。< / p>

因此,Old New Raymond ChenRico Mariani为友谊赛设定了规则。选择一个中文/英文字典作为玩具应用程序上下文:简单到足以编码为业余爱好项目,但复杂程度足以证明非平凡的数据使用模式。规则开始很简单--Raymond编写了一个简单的C ++实现,Rico逐行将其迁移到C#,没有任何复杂性,两个实现都运行了基准测试。之后,随后进行了几次优化迭代。

详细信息如下:123456789101112131415,{ {3}}

这对泰坦的对话非常有教育意义,我全心全意地建议潜入 - 但如果你缺乏时间或耐心,杰夫阿特伍德16

compiled the bottom lines beautifully

最终,C ++的速度提高了2倍 - 但最初的速度要慢13倍。

作为Rico enter image description here

  

因为我的惨败,我感到羞耻吗?几乎不。托管代码   几乎没有任何努力取得了很好的成绩。打败了   管理版,雷蒙德不得不:

     
      
  • 写自己的文件/ io的东西

  •   
  • 编写自己的字符串类

  •   
  • 编写自己的分配器

  •   
  • 撰写自己的国际地图

  •   
     

当然他使用可用的低级库来做到这一点,   但这还有很多工作要做。你可以打电话给STL留下了什么   程序?我不这么认为。

这是我的经验,11年,谁知道以后有多少C#/ C ++版本。

当然,这并非巧合,因为这两种语言在设计目标上有着极大的不同。 C#希望在开发成本是主要考虑因素(仍然是大多数软件)的情况下使用,并且C ++会让你不用花费任何费用来挤出机器的每一次性能:游戏,算法交易,数据中心等。

答案 4 :(得分:5)

C# 比C ++更快。写得快。对于执行时间,没有什么比分析器更好。

但是C#没有像C ++那样容易接口的库。

而C#在很大程度上依赖于Windows ......

答案 5 :(得分:3)

BTW,时间关键型应用程序不是用C#或Java编码的,主要是由于垃圾收集何时执行的不确定性。

在现代,应用程序或执行速度并不像以前那么重要。开发时间表,正确性和稳健性是更高优先级。如果应用程序的高速版本有很多错误,崩溃很多或更糟,错过了进入市场或部署的机会,那么这个应用程序的高速版本并不好。

由于开发时间表是一个优先事项,新的语言正在出现,加快了开发速度。 C#就是其中之一。 C#还通过从C ++中删除导致常见问题的功能来帮助提供正确性和健壮性:一个例子是指针。

在大多数平台上,使用C#开发的应用程序和使用C ++开发的应用程序的执行速度差异可以忽略不计。这是因为执行瓶颈不依赖于语言,但通常取决于操作系统或I / O.例如,如果C ++在5毫秒内执行一个函数但C#使用2毫秒,并且等待数据需要2秒,那么与等待数据的时间相比,在函数中花费的时间是微不足道的。

选择最适合开发人员,平台和项目的语言。努力实现正确性,稳健性和部署的目标。应将应用程序的速度视为错误:优先级,与其他错误进行比较,并根据需要进行修复。

答案 6 :(得分:3)

更好的方式来看待它一切都比C / C ++慢,因为它抽象而不是遵循棒和泥范式。它被称为系统编程是有原因的,你可以针对谷物或裸机进行编程。这样做也可以提高您使用C#或Java等其他语言无法实现的速度。但是,唉,C根本就是以艰难的方式做事,所以你大部分时间都会编写更多的代码并花更多的时间来调试它。

C也区分大小写,C ++中的对象也遵循严格的规则集。例如紫色冰淇淋圆锥可能与蓝色冰淇淋圆锥不同,尽管它们可能是锥形,它们可能不一定属于圆锥体系列,如果您忘记定义哪个圆锥体是您的错误。因此,冰淇淋的性质可能是也可能不是克隆。现在速度参数,C / C ++使用堆栈和堆方法,这是裸金属获得它的金属。

使用升级库,您可以实现令人难以置信的速度,遗憾的是大多数游戏工作室都坚持使用标准库。另一个原因可能是因为用C / C ++编写的软件往往文件大小很大,因为它是一个巨大的文件集合而不是单个文件。另请注意所有操作系统都是用C语言编写的,所以为什么我们必须问问题哪些更快?!

此外,缓存并不比纯内存管理更快,抱歉,但这并不会让人失望。内存是物理的东西,缓存是软件为了获得性能而做的事情。人们还可以推断,如果没有物理内存缓存就根本不存在。事实并非无效,无论是自动还是手动,都必须在某种程度上管理内存。

答案 7 :(得分:1)

如果有更快的路由(C#),为什么要编写一个在C ++中不需要太多优化的小应用程序?

答案 8 :(得分:1)

除非您在特定系统上执行基准测试,否则无法获得问题的准确答案。但是,考虑C#和C ++等编程语言之间的一些基本差异仍然很有意思。

<强>汇编

执行C#代码需要一个额外的步骤,即代码是JIT的。关于有利于C ++的性能。此外,JIT编译器只能在JIT代码单元(例如方法)内优化生成的代码,而C ++编译器可以使用更积极的技术优化方法调用。

但是,JIT编译器能够优化生成的机器代码以与底层硬件紧密匹配,从而使其能够利用其他硬件功能(如果存在)。据我所知,.NET JIT编译器没有这样做,但它可以设想为Atom生成不同的代码而不是Pentium CPU。

内存访问

在许多情况下,垃圾收集架构可以创建比标准C ++代码更优化的内存访问模式。如果用于第一代的内存区域足够小,可以保持在CPU缓存内提高性能。如果创建并销毁许多小对象,则维护托管堆的开销可能小于C ++运行时所需的开销。同样,这在很大程度上取决于应用程序。 A study Python of performance表明,由于更优化的内存访问模式,特定的托管Python应用程序能够比编译版本更好地扩展。

答案 9 :(得分:0)

不要让人困惑!

  • 如果以最好的情况编写C#应用程序并且以最好的情况编写C ++应用程序,那么C ++会更快。
    这里有很多原因可以解释为什么C ++本身就比C#更快,例如C#在Java中使用类似于JVM的虚拟机。基本上更高级别的语言具有较低的性能(如果在最佳情况下使用)。

  • 如果您是一位经验丰富的专业C#程序员,就像您是一位经验丰富的专业C ++程序员一样,使用C#开发应用程序比C ++更容易,更快捷。

这些情况之间的许多其他情况是可能的。例如,您可以编写C#应用程序和C ++应用程序,以便C#app比C ++应用程序运行得更快。

要选择语言,您应该注意项目的情况及其主题。对于一般业务项目,您应该使用C#。对于像视频转换器或图像处理项目这样的高性能需求项目,您应该选择C ++。

更新

行。让我们比较为什么C ++的大多数可能速度超过C#的一些实际原因。考虑一个好的编写C#应用程序和相同的C ++版本:

  • C#使用VM作为中间层来执行应用程序。它有开销。
  • AFAIK CLR无法优化目标计算机中的所有C#代码。可以在具有最多优化的目标机器上编译C ++应用程序。
  • 在C#中,运行时最可能的优化意味着最快的VM。无论如何VM都有开销。
  • C#是一种更高级别的语言,因此它为最终过程生成了更多的程序代码行。 (考虑一下Assembly应用程序和Ruby之间的差异!相同的条件是在C ++和更高级别的语言之间,如C#/ Java)

如果您希望在实践中获得更多信息,请see this。它与Java有关,但也适用于C#。

答案 10 :(得分:0)

主要关注的不是速度,而是Windows版本和升级的稳定性。 Win32主要是对Windows版本免疫,使其非常稳定。

当服务器退役并且软件迁移时,使用.Net的任何事情都会引起很多焦虑,并且通常会对.net版本产生很多恐慌,但10年前构建的Win32应用程序只会保持运行状态。

答案 11 :(得分:-1)

我一直专注于优化大约15年,并且经常重写C ++代码,尽可能多地使用编译器内在函数,因为C ++性能通常远不及CPU的能力。通常需要考虑缓存性能。需要许多向量数学指令来替换标准C ++浮点代码。 大量的STL代码被重新编写,并且通常运行速度快很多倍。随着CPU接近其最佳性能,可以重新编写大量使用数据的数学和代码,并获得惊人的结果。

这在C#中是不可能的。比较他们的相对#real time#表现实际上是一个令人难以置信的无知问题。 C ++中最快的代码就是当每个单独的汇编程序指令针对手头的任务进行优化时,根本没有不必要的指令。每个内存在需要时使用,而不是复制n次,因为这是语言设计所需要的。每个所需的内存移动与缓存协调工作。 在最终算法无法改进的情况下,根据确切的实时要求,考虑准确性和功能性。

然后您将接近最佳解决方案。

将C#与这种理想情况进行比较是惊人的。 C#无法竞争。事实上,我现在正在写一大堆C#代码(当我说重写时我的意思是删除并完全取代它),因为它甚至不在同一个城市,更不用说在实时繁重的时候停球了性能

所以,请停止欺骗自己。 C#很慢。死得很慢。所有软件都在减速,而C#正在使这种速度下降。所有软件都使用汇编程序中的获取执行周期运行(您知道 - 在CPU上)。你使用10倍的指令;它的速度会慢10倍。你瘫痪了缓存;它会变得更慢。你将垃圾收集添加到一个实时的软件中,然后你常常被愚弄认为代码运行'好'只有那几个时刻,当代码'有点慢一段时间'时。

尝试将垃圾收集系统添加到每个周期都很重要的代码中。我想知道股票市场交易软件是否有垃圾收集(你知道吗 - 在新的海底电缆上运行的系统,耗资3亿美元?)。我们可以每2秒节省300毫秒吗?航天飞机上的飞行控制软件怎么样 - GC好吗?性能车辆中的发动机管理软件怎么样? (一个赛季的胜利可能值数百万)。

实时垃圾收集完全失败。

所以不,强调,C ++要快得多。 C#倒退了。