Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure和ClojureScript,哪个更快(为什么)?_Clojure_V8_Clojurescript - Fatal编程技术网

Clojure和ClojureScript,哪个更快(为什么)?

Clojure和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

如果让我猜的话,我很确定答案是Clojure,但我不确定为什么。逻辑上(对我来说)ClojureScript应该更快:

两者都是“动态”的,但都是ClojureScript

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

  • 它也是动态的
  • 在JVM中运行,JVM没有内置的动态支持,所以我认为JVM也必须做V8正在做的事情,以启用动态支持
  • 而且Java比C慢
那么Clojure怎么可能比ClojureScript更快呢?当说JavaScript是动态的而Clojure是动态的时,“动态”的意思是否有所不同?我没有看到什么

(当然,如果ClojureScript确实更快,那么上述推理正确吗?)


我想,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更成熟,近年来做了大量的性能调优工作(包括原始支持、协议等)
当然,可以用任何语言编写快速或慢速代码。这比语言实现之间的根本区别更重要

更重要的是,你在Clojure和