- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我不得不猜测,我很确定答案是 Clojure,但我不确定为什么。从逻辑上(对我来说)看起来 ClojureScript 应该更快:
两者都是“动态的”,但 ClojureScript
最佳答案
实际上,V8 是用 C++ 编写的。但是,它的作用与 JVM 基本相同,并且 JVM 是用 C 编写的。V8 JITs Javascript 代码并执行 JIT'd 代码。同样,JVM JIT 编译(或热点编译)字节码(不是 Java)并执行生成的代码。
字节码不像 Java 那样是静态的。事实上,它可以是非常动态的。另一方面,Java 大多是静态的,将 Java 与字节码混为一谈是不正确的。 java编译器将Java源代码转换成字节码,JVM执行字节码。有关更多信息,我建议您查看 John Rose 的博客 (example)。那里有很多很好的信息。此外,尝试寻找 Cliff Click 的演讲(如 this one )。
同样,Clojure 代码直接编译为字节码,然后 JVM 使用该字节码执行相同的过程。编译 Clojure 通常在运行时完成,这不是最快的过程。同样,将 Clojurescript 翻译成 Javascript 也不是很快。 V8 将 Javascript 转换为可执行形式显然非常快。 Clojure 可以提前编译成字节码,这样可以消除很多启动开销。
正如您所说,说 JVM 解释字节码也不是很正确。 17 年前的 1.0 版本就做到了!
传统上,有两种编译模式。第一种模式是 JIT(即时)编译器。字节码直接翻译成机器码。 Java 的 JIT 编译执行速度很快,并且不会生成高度优化的代码。它运行正常。
第二种模式称为热点编译器。热点编译器非常复杂。它以解释模式非常快速地启动程序,并在程序运行时对其进行分析。当它检测到热点(代码中频繁执行的点)时,它会编译这些热点。而 JIT 编译器必须快速,因为除非它是 JIT 的,否则不会执行任何操作,热点编译器可以花费额外的时间来优化它正在编译的代码中的鼻涕。
此外,它可以稍后返回并重新访问该代码,并在必要和可能的情况下对其应用更多优化。这是热点编译器可以开始击败已编译的 C/C++ 的点。因为它具有代码的运行时知识,所以它可以应用静态 C/C++ 编译器无法进行的优化。例如,它可以内联虚函数。
Hotspot 还有另一个特性,据我所知,其他环境没有,它还可以在必要时对代码进行反优化。例如,如果代码不断地采用单个分支,并且该分支已经过优化并且运行时条件发生变化,迫使代码进入另一个(未优化的)分支,那么性能突然变得很糟糕。 Hotspot 可以取消优化该功能并重新开始分析以找出如何使其更好地运行。
热点的一个缺点是它开始有点慢。 Java 7 JVM 中的一项更改是结合了 JIT 编译器和热点编译器。这个模式是新的,虽然不是默认的,但是一旦它初始启动应该是好的,然后它可以开始advanced optimizations。 JVM非常擅长。
干杯!
关于clojure - Clojure 或 ClojureScript 哪个更快(为什么)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13812407/
为什么该语言的名称是“Clojure”? 我用谷歌搜索了一下,在#clojure 中询问。到目前为止,还没有运气。 最佳答案 Rich Hickey(他是 Clojure 的设计者)对此的评论是 wi
我不明白为什么升级后会出现以下编译错误: Compiling addr-verify.core Exception in thread "main" java.lang.NoClassDefFound
我试图将从映射操作返回的(惰性)序列传递给另一个映射操作,以便我可以在第一个序列中查找元素。代码从文本文件(以行/列格式)解析一些足球装置,清理它,然后返回一张 map 。 这是代码: (ns fix
我想过滤一组,例如: (filter-set even? #{1 2 3 4 5}) ; => #{2 4} 如果我使用clojure.core/filter我得到一个不是集合的seq: (filte
(defn hi[](+ 5 6)) (hi) (defn hi[](+ 6 7)) (hi) 你好,我是 clojure 的新手。如上所述,我编写了两个具有相同名称的函数。我们可以在 cloj
我按照这个伪代码递归地将十进制转换为二进制。 findBinary(decimal) if (decimal == 0) binary = 0 else binar
我正在尝试学习 Clojure 并尝试定义这个简单的函数: user=> (defn triple [arg] (* 3 arg)) #'user/triple user=> (triple 1) 3
是->和 ->>宏只是为了使代码更具可读性还是它们还有其他特定功能? 最佳答案 线程优先( -> )和线程最后( ->> )是为了使代码更具可读性。但这已经很重要了! 它允许取消嵌套函数调用(示例取自
我在 http://www.learningclojure.com/2010/11/yet-another-way-to-write-factorial.html 上找到了这个代码,但我不明白 pop
我正在阅读 Programming Clojure 2nd edition,在第 49 页它涵盖了 Clojure 的 for 循环结构,它说它实际上是一个序列理解。 作者建议使用以下代码: (def
Clojure 中有双端队列吗?我的印象是 Clojure 的 PersistentQueue 是单端的(我错了吗?)。我需要能够从队列的任一端删除(即“pop”)和“peek”数据。我所说的双端队列
换句话说,有没有办法在看起来不像 (MACRO arg* ...) 的表单上触发宏扩展? . 举一个假设的例子: (defmacro my-var (do (printf "Using my-va
我很难理解懒惰。 有人能帮我理解为什么我下面的函数不是懒惰的吗 (defn my-red ([f coll] (my-red f (first coll) (rest coll) ))
在 Clojure 核心中决定参数函数顺序的规则是什么(如果有的话)? 类似 map 的函数和 filter期望数据结构作为最后一个 争论。 类似 assoc 的函数和 select-keys期待数据
我在 clojuredocs 上遇到过 completing 函数,但目前没有文档。 你能提供一些例子吗? 最佳答案 completing 用于扩充可能没有具有一元“完成”元数的一元重载的二元归约函数
这个现在支持吗?我能找到的唯一信息是来自维基的示例( https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching
我正在关注“Clojure in Action”,对此我感到困惑: (defn with-log [function-to-call log-statement ] (fn [& args
对于下面的代码,箭头是宏还是函数名称中的简单字符? (来自 here) (defn file->map [file] ;; TODO ) 最佳答案 箭头是函数名称的一部分。有一个函数定义,不是
Clojure 的 range函数包含来自 start独家在end (如果提供)。核心库中是否有一个函数可以提供完全包含(开始和结束)的范围? 我发现在某些情况下必须调整最终值的代码 - 例如向下而不
当我尝试从 REPL 运行以下代码时(使用动态记录): (defrecord (symbol "rec2") (vec (map symbol ["f1" "f2"]))) 我收到错误 Compile
我是一名优秀的程序员,十分优秀!