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

时间:2011-09-29 07:37:30

标签: performance clojure

基于过去几年的language shootouts,Clojure和其他Lisps的表现始终优于大多数其他动态语言。为什么会这样? 是因为它的homoiconicity

编辑:

我不知道Clojure被编译成字节码就像Java和Scala一样。 This stackoverflow thread阐明了为什么Clojure获得了编译和解释的优势。

1 个答案:

答案 0 :(得分:18)

几乎不可能回答这个问题 - 这在很大程度上取决于基准代码的编写程度,测试的准确程度,是否允许使用利用本机代码的库,是否正在编写“惯用语”代码或优化性能等。

与往常一样,您应谨慎对待所有微基准测试。

话虽如此,以下原因可能在某些情况下给予Clojure优势:

  • 始终编译Clojure - 首先是字节码,然后是JVM JIT编译器的本机代码。在许多情况下,这可以使其具有速度优势,特别是在依赖于某种形式的解释的语言上。至少在理论上,你应该能够在Clojure使你能够产生相同字节码的任何情况下匹配纯Java速度(​​这通常是合理的,但并不总是......)
  • Clojure可以利用JVM原语和静态类型 - 尽管它是一种动态语言,但如果你给它足够的提示,Clojure将编译静态类型或原始代码。这可以轻松地提高性能10倍,但代价是让你的代码更长/更丑......
  • Clojure对某些数据结构和操作进行了大量优化 - 特别是不可变的持久数据结构和某些函数式编程结构,如“reduce”。
  • 宏启用强大的编译时优化 - 如果巧妙地使用宏,您可以在编译时进行一些非常复杂的优化,有效地使用代码生成来生成最有效的代码运行。这是许多Lisps共享的优势(特别是Common Lisp,这是Clojure的一大启示)。正如nulvinge指出的那样,同质性并不是实现这一目标所必需的(C ++也有宏!),但作为一种同性语言使得宏很多更容易。
  • 现代JVM设计精良 - Clojure充分利用了JVM,Java运行时库,垃圾收集算法等数千年的工程设计。非JVM语言没有这些好处。