gpt4 book ai didi

Clojure JVM 7/8 改进

转载 作者:行者123 更新时间:2023-12-03 22:17:48 25 4
gpt4 key购买 nike

Rich Hickey 和其他人提到 Clojure 不会从即将到来的 invokeDynamic 中获得显着的改进。计划用于 JVM 7 或 8,但会从尾递归中获得性能提升。

尾递归会影响

(fn [...] (recur ...))

或者
(loop [...] (recur ...))

我不希望它们变得更快,因为编译器可能已经生成了循环结构。

最佳答案

非你的例子会变得更快,因为如果你使用 recur你已经告诉编译器你有一个尾递归函数,这允许编译器生成使用 goto 的字节码。 (就像一个普通的命令式循环)

如果 JVM 进行尾调用优化,当然会有一些好处。

您将不必再使用 recur (如果您不想),因此您可以编写这样的函数(尾递归函数)

(defn testfn [n] (when (not= 1000 n) (testfn n)))

现在 JVM 无法检测到尾递归。通过添加尾调用优化,JVM 能够看到上面的函数,就像您编写的一样(因此获得命令式循环速度):
(defn testfn [n] (when (not= 1000 n) (recur n)))

所以这不是很大的改进,但还有另一种情况,尾调用优化真的很棒。

如果您有相互调用的函数(有时甚至超过两个)并且不需要保留堆栈(尾递归),JVM 可以优化它们。现在这是不可能的,因为你无法分辨 recur跳转到其他一些功能。这是一个例子。
(defn even [n] (if (zero? n) true (odd? (dec n)))
(defn odd [n] (if (zero? n) false (even (dec n)))

如果你用一个大数字来尝试这个,你知道你会炸毁堆栈,但使用尾调用优化你不会。

我所剩无几。有一个函数叫 trampoline允许您已经这样做(编程风格和一些开销略有变化)而不是解释 trampoline我会向您推荐一个博客,它正是这样做的:

http://pramode.net/clojure/2010/05/08/clojure-trampoline/

关于Clojure JVM 7/8 改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4304468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com