代码之家  ›  专栏  ›  技术社区  ›  WeNeedAnswers

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

  •  4
  • WeNeedAnswers  · 技术社区  · 15 年前

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

    那么,当在CLR中实现时,基于与命令式风格不同的范例的语言有多高效呢?

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

    5 回复  |  直到 15 年前
        1
  •  2
  •   Dean Harding    15 年前

    一天下来, 编程语言被编译成运行它们的CPU的本机代码,因此任何语言(不仅仅是编译成MSIL的语言)都可能会遇到同样的问题。

    对于本质上只是彼此的语法变体的语言(例如C与VB.NET),我不认为会有太大的区别。但是如果两种语言的差异太大(例如C语言和F语言),那么你就不能真正地进行有效的比较,因为你不能真正地写出两个“等价物” 不平凡的

        2
  •  8
  •   Lasse V. Karlsen    15 年前

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

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

        3
  •  7
  •   Tomas Petricek    15 年前

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

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

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

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

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

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

        4
  •  4
  •   kvb    15 年前

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

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

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

    1. 算法差异可能比编译器差异更大(至少在比较CLR上运行的静态类型语言时是这样)
        5
  •  0
  •   Siyfion    15 年前

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

    从我在网上阅读的大部分内容来看,似乎托管C++编译器是优化IL代码的最好的工作,尽管我没有看到任何显示C语言的C++语言的显著差异。

    F级#

    #light
    open System
    printfn "Hello, World!\n"
    Console.ReadKey(true)
    

    C级#

    // Hello1.cs
    public class Hello1
    {
        public static void Main()
        {
            System.Console.WriteLine("Hello, World!");
            System.Console.ReadKey(true);
        }
    }