JVM与CLR上的Clojure性能

JVM与CLR上的Clojure性能,clojure,clojureclr,Clojure,Clojureclr,是否有JVM和CLR上Clojure的性能比较?或者有人在性能敏感代码中同时使用了这两种代码,可以给出一些轶事评论?我没有真正使用CLR版本,因此无法完全回答您的问题 然而,值得注意的是,到目前为止,大部分优化/开发工作都投入到了Clojure的主线JVM版本中。因此,您可以预期Clojure的JVM版本目前在大多数情况下的性能会更好 JVM上的Clojure已经是最快的动态类型化语言之一——从页面上看,Common Lisp是唯一(稍微)快一点的动态类型化语言 随着时间的推移,我预计Cloju

是否有JVM和CLR上Clojure的性能比较?或者有人在性能敏感代码中同时使用了这两种代码,可以给出一些轶事评论?

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

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

JVM上的Clojure已经是最快的动态类型化语言之一——从页面上看,Common Lisp是唯一(稍微)快一点的动态类型化语言


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

Clojure JVM的性能比Clojure CLR好。我没有明确的基准测试,但我有很多在这两种环境中进行编译和运行测试的经验,差别是显而易见的

这种差异有几个因素。一些正在进行中。有些与JVM与CLR perf之间的差异有关,因此超出了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是固定的,那么启动时间真的很快。更多细节

(3) JVM与CLR性能 人们已经注意到如何使ClojureJVM与热点编译器优化一起很好地工作。我没有明确的证据,但我猜HotSpot在诸如编译的Clojure代码内联和CLR抖动方面做得更好。可以公平地说,如何使ClojureCLR更好地利用CLR抖动并没有受到关注


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

如果它对性能敏感,那么您可能希望使用本机代码解决方案,而不是在CLR或JVM上运行的解决方案。我的意思是性能敏感受Clojure支持的限制。我特别感兴趣,因为CLR版本似乎使用DLR。Java有等价物吗?我想知道特定于JVM和特定于CLR的技术(如DLR)对性能的影响有多大。我理解您的意思,我想说@mikera已经回答了您的问题,但在选择CLR与JVM之间存在许多其他问题时,担心CLR与JVM的相对性能似乎还为时过早。我的意思是,CLR库集中存在的库与JVM库中存在的库相比,尤其是在Windows上构建的库,应该比相对性能更值得关注。实际上,这些都不是真正的问题。我只是出于对学术的好奇而提问=)我会继续回答这个问题,希望有CLR经验的人能加入进来。