2009-08-03 52 views

回答

48

这是一个神话。他们编译到相同的CLR。然而,相同例程的编译器在CLR中可能会略有不同。因此对于某些例程,某些可能会稍微好一些,例如C#中的(0.0000001%)更快,反之亦然,但它们都运行在相同的公共运行时间,因此它们在性能方面都相同。

+3

编译到同一个IL并不能保证应用相同的优化。你有没有提到性能会类似? – 2009-08-03 17:51:31

+24

我同意,但有一点要注意:如果你有Option Strict off,那么你基本上会在各处做额外的转换,这往往会使代码显着变慢。你不能在C#中犯这个错误,如果你用C#重写VB.NET代码,会导致性能的提高。 – 2009-08-03 17:51:53

+21

当然,任何值得他们的盐的开发人员都会有Option Strict On。 – 2009-08-03 17:54:01

26

vb.Net中的相同代码可能比c#慢的唯一原因是VB defaults to have checked arithmetic on and c# doesn't

默认情况下,检查Visual Basic中的算术运算和溢出;在C#中,他们不是。

如果您禁用该功能,则生成的IL可能会相同。为了测试它,需要通过Reflector运行代码,如果从c#切换到vb.Net视图,您会发现它看起来非常相似。

在c#编译器和vb.net编译器中进行优化(或者只是行为上的差异)可能会导致另一个稍微偏向另一个。这就是:

  1. 不太可能是显著
    • ,如果它是这将是低垂的果实来解决
  2. 不太可能发生。
    • c#和vb.net的抽象语法树在结构上非常接近。你可以自动将大量的vb.Net转换成c#,反之亦然。更重要的是,结果会成为看起来习惯的好机会。

有在C#中没有在vb.net一些结构,如不安全的指针。在哪里使用,他们可能会提供一些好处,但只有在他们被实际使用并正确使用。如果你是这样的优化,你应该适当地进行基准测试。
坦率地说,如果它使真的是真的很大的区别,那么问题不应该是“我应该使用哪个c#/ vb.net”,而应该问自己为什么不将一些代码移到C++/CLI。

我能想到的是,不同的编译器可能会引入严重的,普遍的分歧的唯一途径是,如果一个选择:

  1. 实现在不同的地方尾调用
  2. 显着更高效地实现迭代器块或匿名lambda。
    • 相信无论是编译器大约在较高的水平一样有效,他们将在这方面得到虽然。这两种语言都需要明确支持f#序列生成器可用的'yield foreach'风格。
  3. 盒装当它是没有必要的,或许通过不使用constrained opcode
    • 我从来没有见过这种事情发生,但会爱它做一个例子。

无论是C#和vb.net编译器目前留下这样的优化复杂的EN-登记的变量,调用约定,内联和完全展开了在CLR的共同JIT编译器。这可能对其他任何事情有更多的影响(特别是当32位和64位JIT的行为现在完全不同时)。

4

该框架是用C#编写的,但仍不能说明C#或VB之间的性能差异,因为所有内容都编译为IL语言,然后实际执行(包括JITted等)。

的责任是对它们产生基于源代码什么样的IL的每个特定语言编译器。如果其他编译器生成比其他编译器更适合的IL,那么它可能会有性能差异。我不完全确切地知道这是否有这种领域会导致完全不同的IL,但我怀疑这种差异仍然很大。

其他方面完全是那么的C#的运行就像使用原始指针等,可以在特殊情况下给予表现不安全代码的能力。

4

在编译器优化中可能会有细微的差异,但我会说没有明显的差异。 C#和VB.NET都编译为Common Intermediate Language。在某些情况下,您可能可以通过使用unsafe code在C#中获得显着的性能提升,但在大多数情况下,我不会推荐这样做。如果你需要一些性能至关重要的东西,你也不应该使用C#。

神话可能开始是因为巨大的与平均C++应用程序相比,Visual Basic 6性能的差异。

2

我在参加微软会议,MS员工表示C#比VB.NET快8%。所以如果这是一个神话,那是由在MS工作的人开始的。如果我能找到说明这一点的幻灯片,我会发布它们,但这是C#刚刚出来的时候。我认为,即使在某个时间点这是事实,那么一个人比另一个人更快的唯一原因就是ShuggyCoUk所说的默认配置方式。

1

像往常一样的答案是,它取决于...本身,没有,VB.Net不比C#慢,至少没有你会注意到的。是的,编译器优化会有细微差别,但生成的IL将基本相同。

但是,VB.Net附带了用于VB6的程序员的兼容性库。我记得那些字符串方法,如左,右,中,旧的VB程序员会期待的。那些字符串操作函数比较慢。我不确定你会注意到一个影响,但取决于他们的使用强度,我敢打赌答案是肯定的。为什么这些方法比“native”.net字符串方法慢?因为它们的类型安全性较低。基本上,你可以向他们扔几乎任何东西,他们会尽力去做你想要的东西,就像在旧的VB6中一样。

我正在考虑字符串操作,但如果我觉得更难,我敢肯定我会记得更多的方法抛入该兼容层(我不记得程序集的名称,但记住它是默认引用的在VB.Net),如果使用,而不是他们的.net“本地”等效,将会有性能影响。

所以,如果你像VB6一样继续编程,那么你可能会注意到一个影响。如果没有,没关系。

0

这不是一个真正的神话。尽管C#和VB.Net都编译为IL,但生成的实际指令可能会有所不同,因为1.编译器可能有不同的优化,2. VB.Net缺省执行的额外检查算术溢出。所以在很多情况下,性能将会一样,但在某些情况下,C#会更快。在极少数情况下,VB.Net也可能会更快。

1

有在生成的代码,可以使C#稍快一些情况下,一些小的差异。例如VB.NET有一些额外的代码来清除方法中的局部变量,而C#没有。

但是,这些差异几乎无法衡量,而且大多数代码与最佳代码差距太大,以至于您只是通过切换语言来使代码运行速度加快而开始出现错误。您可以采取任何CPU密集型代码,而且可以轻松地将其快两倍。一些代码可以快10倍,其他代码可能快10000倍。在这种情况下,使用C#而不是VB.NET可以获得的百分比不值得。

另一方面,学习C#很可能是加速代码的有效方法。不是因为C#可以生成更快的代码,而是因为您将更好地理解C#和VB.NET,使您能够编写代码,在任一种语言中执行都更好。

编辑:
C#和VB.NET编译器显然是或多或少同步开发的。 C#1和C#2之间的速度差异大约是30%,C#和VB.NET并行版本之间的差异要小得多。

0

C#和VB.Net都是由IL编译的。另外C++和F#也是由它编译的。事实上,我提到的四种语言都以相同的速度执行。没有一种“更快的语言”:独特的区别在于自动垃圾收集语言(C#,VB.Net,F#等)和那些不是自动收集的语言(如C++)之间。第二组通常比较慢,因为很少有开发人员知道如何以及何时在堆内存中收集垃圾,但是,如果您了解堆内存,那么如果使用C++,程序可能会更快。硬图形程序通常用C++编写(例如大多数Adobe程序)。你也可以在C#(System.GC.Collect();)和VB.Net(System.GC.Collect)中手动收集垃圾。 我知道这个问题并不完全是固有的,但我想给你提供很多方法和选择。你为你的节目选择正确的方式。