我听说C ++ .NET是最快的,C#是下一个,其次是VB .NET,而Iron-Python和Boo等语言在性能方面排在最后。如果所有.NET语言编译为中间字节代码都相同,为什么性能上有差异?
Boo和Python可以理解,因为所有类型都必须在运行时进行评估。但为什么C ++和C#等语言之间存在差异?
答案 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] )
}
使用反汇编窗口,您将看到这些编译的方式有多么不同。
除了这些编程范例问题,可能存在实际的编译器问题,但我对这些问题一无所知。