C#代码比Visual Basic.NET代码快吗?

Zan*_*oni 16 c# vb.net

C#代码比Visual Basic.NET代码更快,还是一个神话?

Nic*_*rdi 53

这是一个神话.他们编译成同一个CLR.但是,相同例程的编译器在CLR中可能略有不同.因此对于某些例程,对于VB.NET,某些例程可能稍微好一点(0.0000001%),反之亦然,但它们都运行在相同的公共运行时,因此它们在性能相同时都是相同的.

  • 我同意,但有一点需要注意:如果你有Option Strict off,你基本上是在各处进行额外的转换,这通常会使代码显着变慢.你不能用C#犯同样的错误,如果用C#重写VB.NET代码,这可能会带来性能提升. (25认同)
  • 当然,任何值得他们的盐的开发者都会有Option Strict On. (23认同)
  • 我很想看到一个特定的代码示例,其中当前的编译器会产生显着的差异.我更愿意看看JIT是否会生成相同的代码...... (4认同)
  • 编译到相同的IL并不能保证应用相同的优化.你有参考表明性能类似吗? (3认同)
  • @divo:是的,如果你在一个dll上有相同的il和相同的属性,那么它的行为是相同的,无论哪个编译器成功...这就是中间语言的全部意义 (2认同)

Shu*_*oUk 26

vb.Net中相同代码可能比c#慢的唯一原因是VB 默认checked启用算术运算而c#不运行.

默认情况下,检查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. 更有效地实现迭代器块或匿名lambdas.
    • 我相信这两个编译器在这方面的效率和高水平一样高.这两种语言都需要明确支持f#序列生成器可用的"yield foreach"样式.
  3. 在没有必要的情况下装箱,也许是不使用受约束的操作码
    • 我从来没有见过这种情况,但会喜欢它的例子.

c#和vb.net编译器目前都存在这样的优化复杂性,如注册变量,调用约定,内联和展开完全取决于CLR中的通用JIT编译器.这可能会对其他任何事情产生更大的影响(特别是当32位和64位JIT现在可以表现得完全不同时).


And*_*ech 5

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

责任在于每个特定的语言编译器,它们基于源代码生成什么样的IL.如果其他编译器产生比其他编译器更适合的IL,则它可能具有性能差异.我不知道究竟是否存在这样一个区域,它们会造成完全不同的IL,但我怀疑差异仍然很大.

其他方面完全是C#运行不安全代码的能力,比如使用可以在特殊情况下提供性能的原始指针等.