哪个更快,Clojure或ClojureScript(以及为什么)?

lob*_*ism 17 v8 clojure clojurescript

如果我不得不猜测,我很确定答案是Clojure,但我不确定为什么.逻辑上(对我而言)看起来ClojureScript应该更快:

两者都是"动态的",但是ClojureScript

  • 编译为JavaScript,在V8上运行
  • V8引擎可以说是最快的动态语言引擎
  • V8是用C语言编写的

而Clojure:

  • 也是动态的
  • 在JVM中运行,它没有内置的动态支持,因此我认为JVM必须做V8正在做的任何事情,以启用动态支持
  • 而Java比C慢

那么Clojure如何比ClojureScript更快?当说JavaScript是动态的并且Clojure是动态的时,"动态"是否意味着不同的东西?我没看到什么?

(当然,如果ClojureScript 确实快,然后是上面的推理是否正确?)

我想,Clojure编译成什么......至少是问题的一部分.我知道JVM部分不能只是一个普通的解释器(否则ClojureScript会更快),但是Clojure无法编译成常规字节码,因为JVM中没有"动态".那么ClojureScript的编译/执行方式与Clojure的编译/执行方式之间有什么区别?Java是如何编译/执行的,以及各自隐含的性能差异?

Bil*_*ill 30

实际上,V8是用C++编写的.但是,与JVM基本相同,JVM是用C. V8 JIT编写的Javascript代码并执行JIT代码.同样,JVM JIT编译(或热点编译)字节码(非Java)并执行生成的代码.

Bytecode不像Java那样是静态的.事实上它可能非常有活力.另一方面,Java主要是静态的,将Java与字节码混淆是不正确的.java编译器将Java源代码转换为字节码,JVM执行字节码.有关更多信息,我建议您查看John Rose的博客(示例).那里有很多好消息.另外,尝试通过Cliff Click寻找会谈(就像这个).

同样,Clojure代码直接编译为字节码,然后JVM使用该字节码执行相同的过程.编译Clojure通常在运行时完成,这不是最快的过程.同样,Clojurescript到Javascript的翻译也不快.V8将Javascript翻译成可执行形式显然非常快.Clojure可以提前编译为字节码,这可以消除大量的启动开销.

正如你所说,说JVM解释字节码也是不正确的.1.0版本发布于17年前!

传统上,有两种编译模式.第一种模式是JIT(即时)编译器.字节码直接转换为机器码.Java的JIT编译执行速度很快,并且不会生成高度优化的代码.它运行正常.

第二种模式称为热点编译器.热点编译器非常复杂.它在解释模式下非常快速地启动程序,并在程序运行时对其进行分析.当它检测到热点(代码中频繁执行的点)时,它会编译它们.而JIT编译器要快,因为没有执行,除非它JIT'ed热点编译器能花费额外的时间来优化鼻涕出来,它的编译代码.

此外,它可以返回并稍后重新访问该代码,并在必要和可能的情况下对其应用更多优化.这是热点编译器可以开始击败编译的C/C++的点.因为它具有代码的运行时知识,所以它可以应用静态C/C++编译器无法执行的优化.例如,它可以内联虚函数.

Hotspot还有另外一个功能,据我所知,没有其他环境,它还可以在必要时优化代码.例如,如果代码被继续采用单支,并进行了优化和运行条件的变化迫使代码打倒对方(未优化)的分支和性能突然变得可怕.Hotspot可以优化该功能并再次开始分析,以弄清楚如何使其更好地运行.

热点的缺点是它开始有点慢.Java 7 JVM的一个变化是将JIT编译器和热点编译器结合起来.这种模式是新的,它不是默认模式,但一旦初始启动应该是好的,然后它就可以开始JVM非常擅长的高级优化.

干杯!


mik*_*era 25

这个问题很难准确回答,没有参考特定的基准测试任务(甚至是特定版本的Clojure或ClojureScript).

话虽如此,在大多数情况下我都希望Clojure更快一些.原因:

  • Clojure 通常编译为静态代码,因此它实际上并不在运行时进行任何动态查找.这非常重要:高性能代码通常会生成与静态类型Java非常相似的字节码.问题似乎是假设动态语言必须在运行时进行动态方法查找:这种情况并非总是如此(并且通常不在Clojure中)
  • JVM JIT设计得非常好,我相信它目前仍然比JavaScript JIT好一点,尽管V8有多好.
  • 如果您需要并发或需要利用多个内核,那么显然没有竞争,因为JavaScript是单线程的.....
  • Clojure编译器比ClojureScript更成熟,近年来已经进行了大量的性能调优工作(包括原始支持,协议等).

当然,可以用任何语言编写快速或慢速代码.与语言实现之间的根本区别相比,这将产生更大的差异.

更重要的是,您在Clojure和ClojureScript之间的选择在任何情况下都不应该与性能有关.两者都提供了引人注目的生 主要决定因素应该是:

  • 如果要在Web上运行,请使用ClojureScript
  • 如果要在JVM环境中的服务器上运行,请使用Clojure

  • 是的Java与JavaScript可能会给出优化良好的Clojure和经过优化的ClojureScript之间的近似差异.各个平台是限制因素,毕竟.....从长远来看,你可以期待Clojure倾向于Java性能,ClojureScript倾向于JavaScript性能随着编译器变得越来越好. (2认同)