最快的功能语言


18

我最近一直在研究函数式编程,尤其是Haskell和F#,而以前更是如此。经过一番探索之后,我找不到比较杰出的功能语言(Scala,F#等)的基准比较。

考虑到它们是混合语言,我知道这对某些语言(Scala出现)不一定是公平的,但我只想知道哪种语言在哪种操作和总体上胜过哪种语言。


18
语言不是快还是慢,实现是。
starblue

6
语言实现不是很快或慢,使用这些语言实现运行的程序是(与某些其他程序相比)。慈善-当某人谈论一种编程语言比另一种编程语言快时,一种显而易见的有意义的方式是理解他们正在谈论使用特定语言实现运行的特定程序。
igouy 2012年

3
@starblue:这是一个非常随意的答案,而不是一个非常有用的答案。虽然可以用相同的语言创建两个实现,但其中一个要比另一个慢,但是您将其放在其中的方式意味着不存在语言设计细节,而这些细节必然要求其他语言在实现上效率低下。设计,不需要。那根本不是真的。(尤其是在该特定主题中;功能语言对它们而言是臭名昭著的!)
Mason Wheeler

3
@igouy“语言实现不快也不慢”这是不正确的。CPythonvs PyPy很快浮现在脑海。
NlightNFotis 2012年

@NlightNFotis-CPython需要几秒钟?PyPy需要几秒钟?语言的实现并不快也不慢。该程序用CPython需要多少秒?
igouy

Answers:


25

根据“ 伟大的基准游戏”ATS比Haskell,Scala和Common Lisp的一种变体要快得多,但速度较快。之后,Ocaml和F#在速度类别上大致相同,而Racket和Clojure则落后于...

但是,几乎所有这些都根本没有任何意义。这都是问题,机器,编译器,编码技术的问题,在某些情况下是运气不佳的问题。一般而言,像Haskell这样的直接机器编码语言将胜过像F#这样的VM编译语言,并且远胜于纯解释语言。同样,由于静态分析允许在编译而不是运行时计算所有类型的运算,因此静态类型的语言比动态类型的语言要快。同样,这些是通用规则,总会有例外。“范式”与它无关。


我知道有很多因素需要考虑,即使所有事情都很完美,它们在不同数据上的表现也可能不同,但我的问题仍然很模糊。感谢您提供的链接,真的很有帮助-我从不知道ATS可以这么快
Farouk 2012年

尼斯链接以及详细的比较信息。我对看到Clojure占用更多的内存并且花费比Java更长的时间感到失望。我记得关于Clojure具有类似性能的一些说法,但事实并非如此。
DPM

ATS网站指出ATS支持多种编程范例-因此,在您声称ATS比其他方法更快之前,您需要证明这些程序实际上是以功能样式编写的。功能性ATS可能并不比其他的要快。
igouy 2012年

2
Scala网站指出,Scala集成了面向对象和功能特性。您是否检查过Scala程序是作为功能程序而不是面向对象的程序编写的?
igouy 2012年

12

还应该指出,您无法测量/量化编程语言的性能。您能做的最好的事情就是评估在特定平台上运行特定程序的语言的特定实现的性能。

因此,当您询问“最快的功能语言”时,您实际上是在询问当前语言的最佳实现方式。


@igouy的评论提出了这样一个观点,即在语言实现方面还有其他性能指标。例如编译时间。但这并不会改变以下事实:应用程序的运行时间是对语言实现的(间接)度量,而不是语言本身的度量。

以Java为例。假设我只使用经典(Java 1.0)Java的语言功能编写了一个单线程基准。如果我使用JDK 1.0进行编译和运行,我将获得较差的性能('cos JDK 1.0没有本机代码编译器)。如果从JDK 1.1升级到... JDK 1.7,我很可能会逐渐获得更好的结果。但这不是由于Java 语言的更改引起的……因为我的基准测试使用的是相同的语言子集。相反,加速是由于编译器,运行时系统和/或类库的实现有所改进。这些都是实施问题。

另一点是,对于相同的语言,这些实现差异可能确实非常重要(例如,数量级)。因此,语言X的最佳实现比语言Y的最佳(或唯一)实现更快的事实并不一定告诉您有关语言本身的很多知识。


您能做的最好的就是测量特定程序的性能。当我们测量语言实现的性能时,我们想知道编译某个程序需要花费多长时间,而不是该程序需要花费多长时间。
igouy

在特定硬件等上使用该特定语言实现运行时,该程序的运行时间是该特定程序的属性。鉴于该程序的运行时间不是该语言的属性,因此在这种情况下允许该语言名称是慈善的被用作常用的知名语言实现的简写。
igouy 2012年

@igouy-是的。但是,许多人没有区别开来,正如许多旧网站所宣称的那样:“ Java速度很慢。不幸的是,这一废话被整个程序员一代人读懂了……这严重损害了Java的声誉。这就是为什么我在这里提出这一点的原因
Stephen C

当您想自由地说-“一种语言实现的(间接)度量”时,请解释为什么别人不应该自由发言- 一种语言的(间接)度量
igouy

@igouy-1)您可以随意说什么。但这并不能使您正确。2)考虑一种语言的唯一实现是废话的情况。我们对其进行基准测试。然后,我们更新实现并对其进行基准测试,性能得到了显着提高。这是否意味着语言表现有所提高?鉴于语言没有改变,这有什么意义呢!!!
Stephen C

6

如果仅在执行速度上查看语言,则会遗漏一些要点。速度是一件好事,但不是唯一的事情。

Haskell使用非常健壮的类型系统来创建程序,这些程序很有可能没有错误且健壮。

Erlang使用其内置的监视系统,可以使您创建故障系统,从而在面对各种类型的故障时可以提供很高的可靠性。此外,Erlang还可以为您提供某种程度的并发性,这是其他语言难以比拟的。

实际上,我认为现代的执行速度远不及大多数情况下的执行速度。(好吧,如果我正在做大量的数值计算,我可能想使用fortran来提高速度,但除此之外,它并不重要)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.