如果非要我猜的话,我很确定答案是Clojure,但我不确定为什么。从逻辑上(在我看来),ClojureScript看起来应该更快:
两者都是“动态的”,但是ClojureScript
上运行
编写的
而Clojure:
慢
那么Clojure怎么会比ClojureScript更快呢?当说JavaScript是动态的和Clojure是动态的时,“动态”是不是有什么不同的意思?我没看到的是什么?
(当然,如果ClojureScript确实更快,那么上述推理是否正确?)
我猜,Clojure编译to....is是什么至少是问题的一部分。我知道JVM部分不能只是一个普通的解释器(否则ClojureScript会更快),但是Clojure不能编译成常规的字节码,因为JVM中没有“动态”。那么,如何编译/执行ClojureScript和如何编译/执行Clojure以及如何编译/执行普通Java之间有什么不同,以及它们之间隐含的性能差异?
发布于 2012-12-11 12:07:32
如果不引用特定的基准任务(甚至是Clojure或ClojureScript的特定版本),就很难准确回答这个问题。
话虽如此,在大多数情况下,我希望Clojure会更快一些。原因:
当然,可以用任何语言编写快代码或慢代码。这将产生比语言实现之间的根本差异更大的差异。
更根本的是,您在Clojure和ClojureScript之间的选择在任何情况下都不应该与性能有关。两者都提供了令人信服的生产力优势。主要的决定因素应该是:
Clojure
发布于 2012-12-11 11:24:16
实际上,V8是用C++编写的。然而,做的事情基本上和JVM是一样的,JVM是用C编写的。V8 JITs Javascript代码并执行JIT的代码。同样,JVM JIT编译(或hotspot编译)字节码(而不是Java)并执行生成的代码。
字节码不像Java那样是静态的。事实上,它可以是非常动态的。另一方面,Java大多是静态的,将Java与字节码混为一谈是不正确的。java编译器将Java源代码转换为字节码,JVM执行该字节码。有关更多信息,我建议您查看John Rose的博客(example)。这里有很多好的信息。此外,尝试查找Cliff Click的talks (如this one)。
同样,Clojure代码被直接编译为字节码,然后JVM对该字节码执行相同的过程。编译Clojure通常在运行时完成,这不是最快的过程。同样,Clojurescript到Javascript的转换也不是很快。V8将Javascript转换成可执行文件的速度显然相当快。Clojure可以提前编译成字节码,这可以消除大量的启动开销。
正如您所说,说JVM解释字节码也是不正确的。1.0版本早在17年前就做到了!
传统上,有两种编译模式。第一种模式是JIT (Just in Time)编译器。其中字节码被直接翻译成机器代码。Java的JIT编译执行得很快,并且不会生成高度优化的代码。它运行正常。
第二种模式称为hotspot编译器。hotspot编译器非常复杂。它以解释模式快速启动程序,并在程序运行时对其进行分析。当它检测到热点(代码中频繁执行的点)时,它将编译这些热点。而JIT编译器必须很快,因为除非JIT‘’ed,否则什么都不会执行。hotspot编译器可以花费额外的时间来优化它正在编译的代码。
此外,它可以在以后返回并重新访问该代码,并在必要和可能的情况下对其应用更多的优化。这是hotspot编译器可以开始击败编译的C/C++的地方。因为它具有代码的运行时知识,所以它可以应用静态C/C++编译器无法实现的优化。例如,它可以内联虚拟函数。
Hotspot还有另一个功能,据我所知,其他环境都没有这个功能,如果需要的话,它还可以取消优化代码。例如,如果代码不断地采用单个分支,并且该分支经过优化,并且运行时条件发生变化,迫使代码向下移动另一个(未优化的)分支,则性能突然变得非常糟糕。Hotspot可以取消优化该函数,并再次开始分析,以找出如何使其运行得更好。
hotspot的一个缺点是启动有点慢。Java 7 JVM中的一个变化是合并了JIT编译器和hotspot编译器。虽然这种模式是新的,但它不是默认的,但是一旦它是初始启动,它就应该是好的,然后它就可以开始advanced optimizations,这是JVM非常擅长的。
干杯!
发布于 2015-03-22 22:31:38
与其说这是一个答案,不如说是一个历史评论: HotSpot VM和V8 js引擎的起源都可以追溯到Sun Microsystems的Self项目,我认为该项目是许多技术的原型,使它们能够像现在这样快速运行。比较两者时需要考虑的问题。我本想发表这篇评论的,但声誉系统阻止了我。
https://stackoverflow.com/questions/13812407
复制相似问题