Clojure和ClojureScript,哪个更快(为什么)?
如果让我猜的话,我很确定答案是Clojure,但我不确定为什么。逻辑上(对我来说)ClojureScript应该更快: 两者都是“动态”的,但都是ClojureScriptClojure和ClojureScript,哪个更快(为什么)?,clojure,v8,clojurescript,Clojure,V8,Clojurescript,如果让我猜的话,我很确定答案是Clojure,但我不确定为什么。逻辑上(对我来说)ClojureScript应该更快: 两者都是“动态”的,但都是ClojureScript 编译为JavaScript,在V8上运行 V8引擎可以说是最快的动态语言引擎 V8是用C写的 鉴于Clojure: 它也是动态的 在JVM中运行,JVM没有内置的动态支持,所以我认为JVM也必须做V8正在做的事情,以启用动态支持 而且Java比C慢 那么Clojure怎么可能比ClojureScript更快呢?当说J
- 编译为JavaScript,在V8上运行
- V8引擎可以说是最快的动态语言引擎
- V8是用C写的
- 它也是动态的
- 在JVM中运行,JVM没有内置的动态支持,所以我认为JVM也必须做V8正在做的事情,以启用动态支持
- 而且Java比C慢
我想,Clojure编译成什么……至少是问题的一部分。我知道JVM部分不能仅仅是一个简单的解释器(否则ClojureScript会更快),但是Clojure不能编译成常规字节码,因为JVM中没有“动态”。那么,ClojureScript是如何编译/执行的,以及如何编译/修改Culjule以及java是如何编译/执行的,以及在每个< P>中的性能差异实际上,V8是用C++编写的。但是,它的功能基本上与JVM相同,JVM是用C.V8 JITs Javascript代码编写的,并执行JIT代码。同样,JVM JIT编译(或热点编译)字节码(不是Java)并执行生成的代码 字节码不像Java那样是静态的。事实上,它可以是相当动态的。另一方面,Java主要是静态的,将Java与字节码混为一谈是不正确的。java编译器将java源代码转换为字节码,JVM执行字节码。有关更多信息,我建议您查看John Rose的博客()。那里有很多好消息。另外,尝试通过Cliff Click(like)寻找对话 同样,Clojure代码直接编译成字节码,然后JVM对该字节码执行相同的处理。编译Clojure通常在运行时完成,这不是最快的过程。同样,Clojurescript到Javascript的翻译也不快。V8将Javascript转换为可执行形式显然相当快。Clojure可以提前编译成字节码,这可以消除很多启动开销 正如您所说,说JVM解释字节码也不是很正确。1.0版本在17年前就做到了这一点 传统上,有两种编译模式。第一种模式是JIT(即时)编译器。其中字节码直接转换为机器码。Java的JIT编译执行速度很快,并且不会生成高度优化的代码。它运行正常 第二种模式称为热点编译器。热点编译器非常复杂。它以解释模式快速启动程序,并在程序运行时对其进行分析。当它检测热点(代码中经常执行的点)时,它将编译这些热点。而JIT编译器必须很快,因为除非进行JIT,否则不会执行任何操作,而hotspot编译器可以花费额外的时间来优化正在编译的代码中的snot 此外,它可以在以后返回并重新访问该代码,并在必要和可能的情况下对其应用更多优化。这是热点编译器可以开始击败已编译的C/C++的地方。因为它具有代码的运行时知识,所以可以应用静态C/C++编译器无法实现的优化。例如,它可以内联虚拟函数 Hotspot还有另一个特性,据我所知,这是其他环境所没有的,它还可以在必要时对代码进行去优化。例如,如果代码持续执行单个分支,并且该分支已优化,并且运行时条件发生变化,迫使代码执行另一个(未优化的)分支,那么性能会突然变得糟糕。Hotspot可以对该功能进行去优化,并再次开始分析,以找出如何使其更好地运行 hotspot的一个缺点是启动有点慢。Java7JVM中的一个变化是将JIT编译器和热点编译器结合起来。尽管这种模式是新的,而且不是默认模式,但一旦它是初始启动,就应该很好,然后它就可以开始JVM非常擅长的工作
干杯 如果没有特定的基准任务(甚至是Clojure或ClojureScript的特定版本),这个问题很难准确回答 话虽如此,在大多数情况下,我希望Clojure会更快一些。原因:
- Clojure通常编译为静态代码,因此它实际上不会在运行时进行任何动态查找。这一点非常重要:高性能代码通常生成与静态类型Java非常相似的字节码。问题似乎是做出了一个错误的假设,即动态语言必须在运行时进行动态方法查找:情况并非总是如此(Clojure中通常不是这样)
- JVM JIT设计得非常好,我相信它目前仍然比JavaScript JIT好一点,尽管V8有多好
- 如果您需要并发性或需要利用多个核心,那么很明显,这是不争的,因为JavaScript是单线程的
- Clojure编译器比ClojureScript更成熟,近年来做了大量的性能调优工作(包括原始支持、协议等)