首页 文章

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

提问于
浏览
14

基于language shootouts在过去几年中,Clojure和其他Lisps一直表现得比大多数其他动态语言更好 . 为什么会这样?是因为它的homoiconicity

编辑:

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

1 回答

  • 18

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

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

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

    • Clojure is always compiled - 首先是字节码,然后是JVM JIT编译器的本机代码 . 在许多情况下,这可以使其具有速度优势,特别是在依赖于某种形式的解释的语言上 . 至少在理论上,您应该能够在Clojure使您能够生成相同字节码的任何情况下匹配纯Java速度(这通常是合理的,但并不总是......)

    • Clojure can exploit JVM primitives and static typing - 尽管是一种动态语言,如果你给它足够的提示,Clojure将编译静态类型或原始代码 . 这可以轻松地提高性能10倍,但代价是让你的代码更长/更丑......

    • Clojure has heavily optimised certain data structures and operations - 特别是不可变的持久数据结构和某些函数式编程结构,如"reduce" .

    • Macros enable powerful compile-time optimisations - 如果巧妙地使用宏,可以在编译时进行一些非常复杂的优化,有效地使用代码生成来生成在运行时最有效的代码 . 这是许多Lisps共享的优势(特别是Common Lisp,这是Clojure的一大启示) . 正如nulvinge指出的那样,同质性对于实现这一点并不是绝对必要的(C也有宏!),但作为一种同性语言使得宏更容易 .

    • The modern JVMs are brilliantly engineered - Clojure充分利用了JVM,Java运行时库,垃圾收集算法等数以千计的人工年 . 非JVM语言无法获得这些优势 .

相关问题