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

本文关键字:性能 各不相同 语言 net 为什么 | 更新日期: 2023-09-27 18:00:47

我听说C++.NET是最快的,C#紧随其后,其次是VB.NET,Iron Python和Boo等语言的性能排在最后。如果所有.NET语言都编译成相同的中间字节码,为什么性能不同?

对于Boo和Python来说,这是可以理解的,因为所有类型都必须在运行时进行评估。但是为什么像C++和C#这样的语言有区别呢?

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

Python的性能更差,因为它是被解释的,而不是被编译的。它不是在运行前转换为CIL(公共中间语言),而是在运行时转换,这显然会带来性能开销。

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

您还必须考虑对每个实现进行优化所付出的工作量。C#和C++.NET在微软拥有庞大的团队,致力于让他们的编译器产生尽可能快的字节码。IronPython和Boo是志愿者项目,没有那么多的人力或资源,所以它们不会像MS资助的那样快速获得优化。

从本质上讲,语言特性在编译时和运行时都会产生性能/内存成本。这就是为什么.NET语言的性能各不相同;因为它们的特征各不相同。

到目前为止,所有的答案都混淆了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++慢。Net是微软的新VB语言,编译成CIL。

现在:表演。C++通常是最快的,这仅仅是因为它被编译成了本机代码,而且人们30年来一直在优化它的编译器。这是你通常会看到的视频游戏和其他高性能应用程序,但与其他语言相比,使用它有点痛苦。

在.Net语言之间,C#和VB.Net这两大语言在性能方面基本相同。虽然我没有基准测试来证明这一点,但我猜C++/CLI实际上稍微慢了一点,因为微软没有那么重视这种语言,所以可能没有那么多程序员在优化它的编译器。

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

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

有时看起来等效的操作实际上可能需要一些额外的工作(由编译器自动完成)来满足语言要求。例如,在VB中,有一些怪癖,比如每当您捕捉到异常时,它都会更新Err对象;每当您对Object变量执行任何操作时,它都会调用一个函数,该函数会在它是值类型的情况下生成副本。

在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] )
}

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

除了这些编程范式问题之外,可能还有实际的编译器问题,但我对此一无所知。