我最近一直在研究函数式编程,尤其是Haskell和F#,而以前更是如此。经过一番探索之后,我找不到比较杰出的功能语言(Scala,F#等)的基准比较。
考虑到它们是混合语言,我知道这对某些语言(Scala出现)不一定是公平的,但我只想知道哪种语言在哪种操作和总体上胜过哪种语言。
CPython
vs PyPy
很快浮现在脑海。
我最近一直在研究函数式编程,尤其是Haskell和F#,而以前更是如此。经过一番探索之后,我找不到比较杰出的功能语言(Scala,F#等)的基准比较。
考虑到它们是混合语言,我知道这对某些语言(Scala出现)不一定是公平的,但我只想知道哪种语言在哪种操作和总体上胜过哪种语言。
CPython
vs PyPy
很快浮现在脑海。
Answers:
根据“ 伟大的基准游戏”,ATS比Haskell,Scala和Common Lisp的一种变体要快得多,但速度较快。之后,Ocaml和F#在速度类别上大致相同,而Racket和Clojure则落后于...
但是,几乎所有这些都根本没有任何意义。这都是问题,机器,编译器,编码技术的问题,在某些情况下是运气不佳的问题。一般而言,像Haskell这样的直接机器编码语言将胜过像F#这样的VM编译语言,并且远胜于纯解释语言。同样,由于静态分析允许在编译而不是运行时计算所有类型的运算,因此静态类型的语言比动态类型的语言要快。同样,这些是通用规则,总会有例外。“范式”与它无关。
还应该指出,您无法测量/量化编程语言的性能。您能做的最好的事情就是评估在特定平台上运行特定程序的语言的特定实现的性能。
因此,当您询问“最快的功能语言”时,您实际上是在询问当前语言的最佳实现方式。
@igouy的评论提出了这样一个观点,即在语言实现方面还有其他性能指标。例如编译时间。但这并不会改变以下事实:应用程序的运行时间是对语言实现的(间接)度量,而不是语言本身的度量。
以Java为例。假设我只使用经典(Java 1.0)Java的语言功能编写了一个单线程基准。如果我使用JDK 1.0进行编译和运行,我将获得较差的性能('cos JDK 1.0没有本机代码编译器)。如果从JDK 1.1升级到... JDK 1.7,我很可能会逐渐获得更好的结果。但这不是由于Java 语言的更改引起的……因为我的基准测试使用的是相同的语言子集。相反,加速是由于编译器,运行时系统和/或类库的实现有所改进。这些都是实施问题。
另一点是,对于相同的语言,这些实现差异可能确实非常重要(例如,数量级)。因此,语言X的最佳实现比语言Y的最佳(或唯一)实现更快的事实并不一定告诉您有关语言本身的很多知识。