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