12

JVM 与 CLR 上的 Clojure 是否有性能比较?或者也许有人同时使用了性能敏感的代码可以给出一些轶事评论?

4

2 回答 2

22

Clojure JVM 的性能优于 Clojure CLR。我没有明确的基准可以指出,但我在两种环境中进行编译和运行测试都有很多经验,而且区别很明显。

造成这种差异的因素有很多。有些正在研究中。有些与 JVM 与 CLR 性能差异有关,因此超出了 ClojureCLR 开发人员的解决方法。

(1) 将 Clojure 代码编译为平台中间语言。
在最基本的层面上,生成的 IL 几乎是相同的。但是,动态语言运行时的某些限制所强制的设计选择会导致每个函数定义创建一个额外的类和函数调用以进行额外的方法调用。ClojureCLR 1.4 版(即将推出)消除了在大多数代码生成中使用 DLR。(DLR 仍将用于 CLR 互操作和多态内联缓存。)此时,生成的代码将与 JVM 版本基本相同。启动时间减少了 10%,简单的基准测试显示比 1.3 版改进了 4-16%。更多细节在这里

(2) 启动时间 Clojure JVM 的启动速度明显快于 Clojure CLR。其中大部分可以追溯到 JVM 能够选择性地加载类文件(相对于 CLR 加载整个程序集)以及 JIT 编译发生时间的差异。但是,如果 ClojureCLR 是 NGEN 的,那么启动时间会非常快。更多细节在这里

(3) JVM 与 CLR 的性能 一些人关注使 ClojureJVM 与 HotSpot 编译器优化一起工作。我没有明确的证据,但我猜 HotSpot 只是在编译的 Clojure 代码中的内联与 CLR JITter 相比做得更好。公平地说,没有人关注如何让 ClojureCLR 更好地利用 CLR JITter。

ClojureCLR 1.4 的发布将为一些基准测试提供一个很好的机会。

于 2012-05-31T16:36:14.720 回答
7

我还没有真正使用过 CLR 版本,因此无法完全回答您的问题。

然而值得注意的是,到目前为止,大部分优化/开发工作都进入了 Clojure 的主线 JVM 版本。因此,您可以预期 Clojure 的 JVM 版本目前在大多数情况下性能要好得多。

JVM 上的 Clojure 已经是最快的动态类型语言之一 - 从基准测试游戏页面 Common Lisp 是唯一(稍微)更快的动态类型语言。

随着时间的推移,我预计 Clojure JVM/CLR 的差距会缩小,因为这两个版本都倾向于其主机平台的性能。但现在,如果性能是您最关心的问题,我肯定会推荐 JVM 版本(以及性能,JVM 版本也可能在整体成熟度、库可用性和跨平台支持方面更好)。

于 2012-05-31T03:54:52.597 回答