【问题标题】:Why Clojure/Lisp Programs are faster than other dynamic languages?为什么 Clojure/Lisp 程序比其他动态语言更快?
【发布时间】:2011-09-29 07:37:29
【问题描述】:

基于过去几年的language shootouts,Clojure 和其他 Lisp 的性能始终优于大多数其他动态语言。为什么呢? 是不是因为它的homoiconicity

编辑:

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

【问题讨论】:

    标签: performance clojure


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 稍微扩展一下:宏和元语言由于同音性很容易完成,但同音性不是必需的,所以它不是快速的。
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多