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

Sal*_*lil 14 performance clojure

基于过去几年的语言枪战,Clojure和其他Lisps的表现始终比其他大多数动态语言都要好.为什么会这样?是因为它的同质性吗?

编辑:

我不知道Clojure被编译成字节码就像Java和Scala一样. 这个stackoverflow线程揭示了为什么Clojure获得了编译和解释的优势.

mik*_*era 18

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

因此,一如既往,您应该谨慎对待所有微基准测试.

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

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

  • 稍微扩展一下:由于同质性,宏和元语言很容易完成,但同质性不是必需的,所以它不是那么使它快速的. (3认同)