为什么Clojure/Lisp程序比其他动态语言更快?

14

根据过去几年的语言 shootout 比较,Clojure 和其他 Lisp 方言一直表现比大多数其他动态语言更好。为什么会是这样呢? 是因为它的同构性吗?

编辑:

我不知道 Clojure 也和 Java 和 Scala 一样被编译成字节码。 这个 stackoverflow 帖子解释了为什么 Clojure 能同时享受编译和解释两种方式的优势。

1个回答

18

回答这个问题几乎是不可能的 - 这在很大程度上取决于基准代码编写得有多好,测试的内容是什么,是否允许使用利用本地代码的库,是编写“惯用”代码还是针对性能进行优化等。

因此,像往常一样,您应该谨慎对待所有微基准测试。

尽管如此,在某些情况下,以下原因可能会给Clojure带来优势:

  • Clojure始终被编译 - 首先通过字节码编译,然后由JVM JIT编译器转换为本地代码。这在许多情况下可以使其具有速度优势,特别是比起依赖某种形式的解释的语言。至少在理论上,您应该能够在Clojure启用您生成相同字节码的任何情况下匹配纯Java速度(这通常发生,但并非总是....)
  • Clojure可以利用JVM原语和静态类型 - 尽管是动态语言,如果您提供足够的提示,Clojure将编译为静态类型或原语代码。这可以轻松地提高10倍以上的性能,但代价是使您的代码有点长/难看....
  • Clojure已经大幅度优化某些数据结构和操作 - 特别是不可变持久性数据结构和某些函数式编程构造,如“reduce”。
  • 宏使得强大的编译时优化成为可能 - 如果聪明地使用宏,您可以在编译时进行一些相当复杂的优化,有效地使用代码生成来产生在运行时最高效的代码。这是许多Lisp语言共享的优势(特别是Common Lisp,这是Clojure的灵感之一)。正如nulvinge所指出的那样,同构性并非必需品(C ++也有宏!),但同构性语言使得宏更加容易
  • 现代JVM非常精妙 - Clojure利用了数千年的工程研究成果,包括JVM、Java运行时库、垃圾回收算法等。非JVM语言无法获得这些好处。

4
稍微展开一下:由于同像性,宏和元语言非常容易实现,但同像性并非必需,因此并不是它使其快速的原因。 - nulvinge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接