lob*_*ism 17 v8 clojure clojurescript
如果我不得不猜测,我很确定答案是Clojure,但我不确定为什么.逻辑上(对我而言)看起来ClojureScript应该更快:
两者都是"动态的",但是ClojureScript
而Clojure:
那么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和ClojureScript之间的选择在任何情况下都不应该与性能有关.两者都提供了引人注目的生 主要决定因素应该是:
| 归档时间: |
|
| 查看次数: |
6267 次 |
| 最近记录: |