2024年 Clojure 状态调查! 分享您的看法。

欢迎!请查看 关于 页面以获取更多关于如何使用本站的信息。

0 投票
Clojure

clojure.core/sort-by 对每次成对比较都会评估 keyfn。当 keyfn 计算昂贵时,这是浪费的。

`
user=> (def keyfn-calls (atom 0))

'user/keyfn-calls

user=> (defn keyfn [x] (do (swap! keyfn-calls inc) x))

'user/keyfn

user=> @keyfn-calls
0
user=> (sort-by keyfn (repeatedly 10 rand))
(0.1647483850582695 0.2836687590331822 0.3222305842748623 0.3850390922996001 0.41965440953966326 0.4777580378736771 0.6051704988802923 0.659376178201709 0.8459820304223701 0.938863131161208)
user=> @keyfn-calls
44
`

6 个回答

0 投票

评论由:stevemkim

(链接:CLJ-99) 是一个类似的问题

0 投票

评论由:michaelblume

避免在使用之前定义

0 投票

评论由:jafingerhut

Michael,您的补丁 CLJ-1402-v2.patch 有意改变了 sort-by 的文档字符串吗?因为您要删除的句子现在已经过时了?如果是,那么最好在评论中明确提及。

0 投票

评论由:michaelblume

是的,这个补丁改变了 sort-by 的行为,使其对集合进行映射,然后对结果 seq 进行排序。这意味着数组将不会被修改,而是创建一个新的 seq。

0 投票

评论由:alexmiller 提出

这个补丁看起来会因为额外的分配而导致速度变慢而不是变快,在认真考虑之前,真需要做性能测试。

0 投票
参考:https://clojure.atlassian.net/browse/CLJ-1402(由 alex+import 报告)
...