C# 在.net中使用的所有语言是否性能相同?

C# 在.net中使用的所有语言是否性能相同?,c#,f#,clr,C#,F#,Clr,我知道这个问题的“推销”答案是肯定的,但从技术上讲这是真的吗 公共语言运行库(CLR)被设计为基于命令式编程(IP)的中间语言,但这在处理声明式编程(DP)时有明显的含义 那么,当在CLR中实现时,基于与命令式风格不同的范例的语言的效率如何 我也有一种感觉,DP的步骤将导致一个额外的抽象级别,可能根本无法建模,这是一个公平的评论吗 我用F#做了一些简单的测试,看起来都很棒,但是如果程序变得更复杂,我会错过什么吗?不能保证语言为等效代码生成相同的IL,所以我可以放心地说,不能保证所有.NET语言都

我知道这个问题的“推销”答案是肯定的,但从技术上讲这是真的吗

公共语言运行库(CLR)被设计为基于命令式编程(IP)的中间语言,但这在处理声明式编程(DP)时有明显的含义

那么,当在CLR中实现时,基于与命令式风格不同的范例的语言的效率如何

我也有一种感觉,DP的步骤将导致一个额外的抽象级别,可能根本无法建模,这是一个公平的评论吗


我用F#做了一些简单的测试,看起来都很棒,但是如果程序变得更复杂,我会错过什么吗?

不能保证语言为等效代码生成相同的IL,所以我可以放心地说,不能保证所有.NET语言都具有相同的性能

但是,如果它们产生相同的IL输出,那么就没有区别。

在一天结束时,所有编程语言都被编译成它们运行的CPU的本机机器代码,因此可以对任何语言提出相同的问题(不仅仅是编译为MSIL的语言)


对于本质上只是彼此的语法变体的语言(例如C#vs.VB.NET),我不希望有太大的区别。但是如果两种语言的差异太大(例如C#vs.F#),那么你就无法进行有效的比较,因为你无论如何也无法用这两种语言编写两个“等效”的非平凡代码示例。

这种语言可以被认为是IL代码的“前端”,因此,两种语言之间的唯一区别在于编译器将生成相同的IL代码还是效率更低/更高的代码

<>从我在网上阅读的大部分内容来看,似乎托管C++编译器是优化IL代码的最好的工作,尽管我没有看到任何显示C语言的主要语言C/C++/VB.NET ./P>之间的显著区别。 您甚至可以尝试将以下内容编译成IL并查看

F#

C#


首先,.NET平台上广泛的语言肯定包含生成不同性能代码的语言,因此并非所有语言的性能都相同。它们都编译为相同的中间语言(IL),但生成的代码可能不同,有些语言可能依赖于反射或动态语言运行时(DLR)等

但是,BCL(以及这些语言使用的其他库)确实具有相同的性能,无论您从哪种语言调用它们-这意味着如果您使用一些库进行昂贵的计算或渲染,而不亲自进行复杂的计算,你用哪种语言来称呼它其实并不重要

我认为思考这个问题的最佳方式不是思考语言,而是思考这些语言中可用的不同特性和编程风格。以下列出了其中一些:

  • 不安全代码:您可以在C++/CLI中使用不安全代码,在某种程度上也可以在C#中使用。这可能是编写某些操作最有效的方法,但是您会失去一些安全保证

  • 静态类型,命令式:这是C#和VB.Net中常见的编程风格,但也可以使用F#中的命令式风格。值得注意的是,许多尾部递归函数被编译为静态类型的命令式IL代码,因此这也适用于一些F#函数

  • 静态类型,功能性:大多数F#程序都使用此功能。生成的代码与命令类使用的代码有很大不同,但它仍然是静态类型的,因此没有明显的性能损失。比较命令式和函数式有点困难,因为两个版本中的最佳实现看起来完全不同

  • 动态类型的:像IronPython和IronRuby这样的语言使用动态语言运行时,它实现动态方法调用等。这比静态类型的代码慢一些(但DLR在许多方面都得到了优化)。请注意,使用C#4.0
    dynamic
    编写的代码也属于这一类


有许多其他语言可能不属于这些类别,但是我相信上面的列表涵盖了大多数常见情况(当然也涵盖了所有Microsoft语言)。

我确信,在某些情况下,使用一种.NET语言编写的惯用代码的性能要比另一种稍高一些。然而,退一步,这又有什么关系呢?你心中有绩效目标吗?即使在一种语言中,您也常常可以做出影响性能的选择,有时您需要在性能与可维护性或开发时间之间进行权衡。如果您没有一个目标来确定什么是可接受的性能,那么就不可能评估语言之间的任何性能差异是有意义的还是可以忽略的

此外,编译器也在不断发展,所以今天的相对性能并不一定会持续下去。JIT编译器也在不断发展。甚至处理器设计也是可变的和不断发展的,因此相同的JITTed本机代码可以在具有不同缓存层次结构、管道大小、分支预测等的处理器之间执行不同的操作

话虽如此,可能有一些基本适用的广泛规则:

  • 算法差异可能比编译器差异更大(至少在比较CLR上运行的静态类型语言时)
  • 对于易于并行化的问题,易于利用多处理器/内核的语言将提供一种简单的方法来加速代码
  • 我想你已经成功了
    #light
    open System
    printfn "Hello, World!\n"
    Console.ReadKey(true)
    
    // Hello1.cs
    public class Hello1
    {
        public static void Main()
        {
            System.Console.WriteLine("Hello, World!");
            System.Console.ReadKey(true);
        }
    }