C#比VB.NET更快吗?

13

你可能认为两者是相同的。

但也许是微软使用的编译器不同,我注意到当编译两个非常小的程序时,逻辑相同。VB.NET 使用更多的 IL 指令。

那么,是否真的意味着 C# 必须更快,仅因为它的编译器更聪明呢?


8
指令越多不一定代表程序运行更慢。 - ChaosPandion
3
你确定逻辑是完全相同的吗?如果足够小,你能贴出两个例子吗? - Bob Kaufman
可能是Is C# code faster than Visual Basic.NET code?的重复问题。 - Brian Gideon
@封闭者们... 真的吗?255次浏览和9个赞,你认为这太主观了吗? - user279521
1
我认为这一点并不主观。事实上,我认为这是一个完全有效的问题。我投票关闭是因为我发现了多个完全相同的重复内容。 - Brian Gideon
6个回答

15

根据提供的有限信息来回答这个问题确实很困难。如果您提供了两个样本的代码和编译器选项,那么将有助于解答。

不过,简单回答一下,C#并不天生更快。两种语言都生成IL并在CLR上运行。对于大多数特性,它们甚至生成相同的IL。虽然某些类似特性存在差异,但它们很少会造成显著的性能变化。

如果遇到语言和环境中的一些微妙差异,VB可能看起来较慢。一些常见的例子包括...

  • 许多环境默认情况下针对VB.Net进行整数检查操作,但对C#则不然
  • 细微的编码问题可能导致晚期绑定,在这种情况下它看起来像是早期绑定
  • 认为switchSelect具有相同的语义

一旦解决了这些问题,这些语言的性能表现非常相似。


11

答案是肯定的和否定的。这真的取决于您所指的特定功能。同样,有些地方VB执行得更快。我可以举出每个例子。

这段VB代码...

For i As Integer = 0 To Convert.ToInt32(Math.Pow(10, 8))
Next

这段代码比C#中的代码快了大约100倍。

for (int i = 0; i <= Convert.ToInt32(Math.Pow(10, 8)); i++)
{
}

并不是VB编译器生成执行 for 循环更快的代码,而是VB只在计算循环边界时进行一次,而C#在每次迭代时都计算循环条件。这只是这些语言设计时本质上的区别。

这段代码是C#...

int value = 0;
for (int i = 0; i <= NUM_ITERATIONS; i++)
{
  value += 1;
}

相比VB,这个等效的操作稍微更快。

Dim value As Integer = 0
For i As Integer = 0 To NUM_ITERATIONS
  value += 1
Next
在这种情况下,原因是VB的默认行为是执行溢出检查,而C#则没有。我确信这些语言中还有其他的差异表现出类似的性能偏差。但是,这两种语言都基于CLR构建,并且编译成相同的IL。因此,如果不添加重要的限定词“在情况Z下”,那么做出像“X语言比Y语言更快”的概括性陈述就是不正确的。

7

C#更接近于IL(Intermediate Language,中间语言)而不是VB.NET。

VB.NET有时会在幕后执行许多操作。例如On Error Resume Next,它为每个语句编写了一个try catch块。

但总的来说,两者具有相同的功能和性能。

您可以在Reflector中打开代码并查看其C#代码。请注意C#代码是否符合您的预期。


2
C# 在幕后也做了很多工作,例如 usinglockforeach。编译器还可以大幅改变您的代码以提高性能。 - ChaosPandion
是的,但一般来说它比VB.NET更接近。 - Felipe Pessoto
5
闭包和yield return与IL(Intermediate Language中间语言)接近吗?不是的,编译器会创建大量的IL,有时甚至包括整个新类来支持一个或两个C#语句。C#与IL非常不同,而这也是好事!人们曾经说C接近于汇编语言,这是你考虑的吗? - MarkJ
1
我只是说它比VB.NET更接近,而不是和IL相等。 - Felipe Pessoto
我认为那也不正确,而且无论如何这与C#代码是否更快/更好无关。 - MarkJ

3

请确保这些程序确实是完全相同的。例如,根据选项,以下两行实际上是非常不同的:

Dim x = "some string"

.

string x = "some string";

为了匹配C#代码,VB应该如下所示:
Dim x As String = "some string"

1
使用VB中的Option Infer On,这两行不是相同的吗? - Meta-Knight
@Meta 是的,因此有“根据选项而定”的短语。不过我会进行两个编辑以澄清:1)将Options改为大写;2)将var改为string。 - Joel Coehoorn
@Meta-Night 是的,它们与 Option Infer On 完全相同。但这只是从 2008 年及以上开始的新项目的默认设置。旧项目仍然使用 Option Infer Off 进行升级,以防止晚期绑定的转换问题。 - JaredPar

2

0

我没有做过任何测试,但我认为速度应该差不多。如果有什么区别,就选择编码风格和语法。


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