2024 Clojure 状态调查中分享你的想法!

欢迎来到这里!请查看关于页面以了解更多如何使用本网站的信息。

0
Clojure
在测试一些 Specter 用例时,这被发现在性能瓶颈中。

对 `constantly` 常用情况的回顾表明, arity 1 情况是野外的 `constantly` 最常见的用法,因此只对两个参数进行了展开。

性能测试


(使用 'criterium.core)
(定义 f (constantly 1))
(bench (dotimes [_ 1000] (f)))
(bench (dotimes [_ 1000] (f 1)))
(bench (dotimes [_ 1000] (f 1 2)))

;; 结果
;; 参数数 展开前         展开后
;; 0     611.455589 纳秒  607.800747 纳秒    (预期没有变化)
;; 1     3.098828 微秒    611.116510 纳秒    (~5倍改进)
;; 2     3.508726 微秒    620.415032 纳秒    (~5倍改进)


*补丁:* 0001-CLJ-2228-Improve-performance-of-constantly.patch

*预审者:* Alex Miller

5 答案

0

评论者:alexmiller

我想指出我们的工作流程图在https://dev.clojure.org/display/community/JIRA workflow。我已经对此进行了分类,但如果它未被预审,不太可能在下一个版本中进行审查,除非有一个补丁。因此,如果您能

  • 提到使用 Specter 时它的影响用例
  • 附加一个补丁
  • 在任务描述中包含基准测试结果

我有一个问题,需要展开多少个参数。10看起来似乎太多?我的猜测是,最多2或3个参数就可以覆盖90%的情况,但可以在https://crossclj.info/fun/clojure.core/constantly.html或进行其他研究来获取一些想法。

0

评论者:alexmiller

Specter 中你遇到的时常数的最大阶数是多少?

0

评论者:alexmiller

我进行了一些调查,我怀疑 1 阶是 98% 的用例,而 0 阶则占剩下的大部分。我实际上没有找到任何阶数大于 1 的例子,尽管我相信外面有些。我认为将阶数展开到 2 阶就足够了。

0

评论人:nathanmarz

Specter 使用时常数的 1 阶,因此这个补丁对 Specter 已经足够了。

0
参考资料:https://clojure.atlassian.net/browse/CLJ-2228(由 alex+import 报告)
...