请在
2024年Clojure状态调查!
中分享您的想法。
欢迎!请查阅
关于
页面获取更多关于这个网站如何运作的信息。
GitHub登录
所有活动
问题
未回答
标签
提出问题
关于
提出问题
锁定表达式会导致变量被解引用,即使没有执行,除非用let包裹
0
投票
提问
2013年11月17日
在
Clojure
由
jira
Michał Marczyk在以下讨论线程中发现的性能较差的一个示例的描述。
以下编译版本的差异:
(defn foo [x]
(if (> x 0)
(inc x)
(locking o
(dec x))))
与
(defn bar [x]
(if (> x 0)
(inc x)
(let [res (locking o
(dec x))]
res)))
非常显著。foo被编译成一个单一类,调用由单个调用方法处理;bar被编译成一个bar类以及一个额外的类来处理(locking o (dec x))部分——可能非常类似于手动编码锁部分的输出(尽管我还没有真正查看过)。内部函数是一个闭包,所以调用它涉及分配一个闭包对象;其构造器接收闭包变量作为参数并将它们存储在两个字段(lockee和x)中。然后它们从闭包的调用方法体等中的字段中加载。
注意:摘要行可能是对根本原因的过于狭窄的描述,这只是首先注意到并研究此问题的案例之一。如果您诊断此问题,请使摘要和此描述更准确。
在此处查看Clojure组上的讨论线程:
https://groups.google.com/forum/#!topic/clojure/x86VygZYf4Y
请求
jira
请
登录
或
注册
以添加评论。
请
登录
或
注册
以回答此问题。
2
个答案
0
投票
回答
2014年4月18日
由
jira
评论来自:hiredman_
也许对其他人来说已经很清楚了,但这对我并不立即清楚
的原因
(defn bar [x]
(if (> x 0)
(inc x)
(let [res (locking o
(dec x))]
res)))
产生第二个类,因为锁定是一个包含try/finally形式的宏。
将try/finally的结果绑定到结果(就像let一样)需要生成一些非常棘手的代码,而不添加额外的函数,所以当然Clojure编译会添加额外的函数。
请
登录
或
注册
以添加评论。
0
投票
已回答
Jun 26, 2019
由
jira
参考:
https://clojure.atlassian.net/browse/CLJ-1296
(由jafingerhut报告)
请
登录
或
注册
以添加评论。
欢迎使用Clojure问答,在这里您可以向Clojure社区的成员提问并获得答案。
相关问题
cljs.core.specs.alpha: 检查let绑定向量是否为偶数
为字符串trim函数添加可选的判定函数,以确定是否需要移除字符
允许vars使用无限参数列表进行调用
clojure.lang.ExceptionInfo不应在它的两参数构造函数中传递null原因
为什么当*default-data-reader-fn*设置为tagged-literal时,未知标记字面量不能嵌入到表达式当中呢?
类别
所有类别
Clojure
(1.5k)
语法和阅读器
(73)
编译器
(135)
宏
(25)
记录和类型
(19)
集合
(76)
序列
(24)
转换器
(27)
多重方法
(9)
协议
(24)
元数据
(6)
命名空间和变量
(18)
refs、代理、原子
(10)
Java互操作
(79)
IO
(20)
错误
(75)
REPL
(48)
打印
(38)
正则表达式
(2)
Spec
(169)
测试
(25)
文档
(100)
ClojureScript
(610)
ClojureCLR
(25)
贡献库
(719)
工具
(72)
元数据
(19)
其他
(91)
...