gpt4 book ai didi

performance - `let` 在 Clojure 中是如何实现的,它的开销是多少?

转载 作者:行者123 更新时间:2023-12-03 12:20:28 24 4
gpt4 key购买 nike

我可以看到两种实现方式 let绑定(bind)。首先,从 SICP 得知, let可以实现为 lambda 函数 .这既方便又简单,但考虑到每个 lambda ( fn ) 在 JVM 中被翻译成单独的类以及 let 的次数在普通程序中使用,这似乎非常非常昂贵。

二、let绑定(bind)可以直接翻译成本地 Java 变量 .这几乎没有开销,但是将绑定(bind)存储在堆栈上会破坏语言语义:在这种情况下,创建闭包是不可能的 - 保存的值将在堆栈展开后立即被销毁。

那么 Clojure 中使用的实际实现是什么?指向 Clojure 源代码中的相应行表示赞赏。

最佳答案

let绑定(bind)变量存储为 最终 堆栈上的本地值。

由于它们是最终的,因此可以在需要时将它们绑定(bind)到闭包中(这类似于在 Java 的匿名内部类中使用最终局部变量的方式)。在底层,JVM 将值复制到代表闭包的对象中(它被存储为最终字段)。结果,即使在堆栈帧消失后,闭包仍然有效。

总体而言,let-bound 变量的开销极低,从性能角度来看,您应该毫不犹豫地使用它们。在 JVM 上可能无法做得更好。

关于performance - `let` 在 Clojure 中是如何实现的,它的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10611444/

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