为什么.net语言的性能不同?

时间:2011-06-28 15:40:56

标签: c# .net performance programming-languages

我听说C ++ .NET是最快的,C#是下一个,其次是VB .NET,而Iron-Python和Boo等语言在性能方面排在最后。如果所有.NET语言编译为中间字节代码都相同,为什么性能上有差异?

Boo和Python可以理解,因为所有类型都必须在运行时进行评估。但为什么C ++和C#等语言之间存在差异?

5 个答案:

答案 0 :(得分:18)

Python表现更差,因为它被解释,而不是编译。它不是在运行之前转换为CIL(通用中间语言),而是在运行时转换,这显然会导致性能开销。

此外,由于IronPython是动态类型的,与静态类型语言(C ++,C#,以及尽管使用Pythonesque语法,Boo也是如此)相比,可以进行更少的优化。

您还必须考虑为每个实施进行优化所付出的努力量。 C#和C ++ .NET拥有庞大的团队,致力于让他们的编译器生成最快的字节码。 IronPython和Boo是志愿者项目,没有相当多的人力或资源,所以他们不会像MS资助的那样迅速获得优化。

基本上,语言功能在编译时和运行时都会有性能/内存成本。这就是.NET语言性能不同的原因;因为它们的特征各不相同。

答案 1 :(得分:8)

到目前为止,所有答案都混淆了C ++和“C ++ .Net”(实际上现在称为C++/CLI) - 这是两种完全不同的语言。

C++被编译为本机机器代码。 C ++ / CLI编译为CIL(。Net)字节码。因此,C ++程序往往比C ++ / CLI代码快一点。 C ++已有30年历史,并广泛应用于编程领域。另一方面,C ++ / CLI大约有10年的历史,并没有被广泛使用。它的主要目的是将C ++程序转换为.Net更容易 - 从C ++到C ++ / CLI比从C ++转到C#要少得多。

上面的一条评论中还有另一个混淆:VB6和VB.Net之间。 VB6是微软的旧VB语言,现已弃用。它被编译为本机机器代码,尽管人们普遍认为(大多数情况下)它比C ++慢。 VB.Net是微软的新VB语言,编译为CIL。

现在:表现。 C ++通常是最快的,因为它被编译为本机机器代码,并且因为人们已经在优化其编译器30年。这就是你通常会看到的视频游戏和其他高性能应用程序,但是,与其他语言相比,使用起来很麻烦。

在.Net语言之间,两个大的语言 - C#和VB.Net - 在性能方面大致相同。虽然我没有基准来证明这一点,但我会猜测 C ++ / CLI实际上是更慢,只是因为微软没有过多地强调这种语言,所以可能没有那么多程序员在优化其编译器。

IronPython,因为它没有一个全职团队来优化其编译器,可能会是最慢的。它也运行在DLR之上,这只是另一层间接。此外,另一个答案表明它被解释,这将是一个性能杀手。

答案 2 :(得分:7)

请记住,与C#或VB.Net不同,并非所有使用Visual Studio .Net创建的C ++程序都使用.Net框架。您也可以使用它创建直接的C ++程序,速度非常快。

答案 3 :(得分:1)

有时,看似等效的操作实际上可能需要一些额外的工作(由编译器自动完成)以符合语言要求。例如在VB中,有一些怪癖就像每次捕获异常时都更新Err object;每当你使用Object变量做几乎任何事情时,它会调用a function来制作副本,以防它是值类型。

答案 4 :(得分:1)

在C ++ / cli中遵循C ++本能将导致比在C#中使用C#本能更快的代码,例如循环数据时。当然,您可以使用不安全的C#代码来完成同样的事情,并且您可以在C ++ / cli中使用数组,但如果您遵循相当标准的语言范例,则在适当的情况下可能会有巨大的性能差异,例如: 10到1紧密循环,有大量数据访问。

C ++ / cli中的C ++范例

char * position = start;
char * end = position + data_count;
while ( position < start ) {
     { do stuff with the data )
     position ++;
}

C#范例

for ( int i = 0 ; i < count; i ++ ) {
    { do stuff with data[i] )
}

使用反汇编窗口,您将看到这些编译的方式有多么不同。

除了这些编程范例问题,可能存在实际的编译器问题,但我对这些问题一无所知。