2024年Clojure调查中分享您的见解!

欢迎!请参阅关于页面以了解此信息。

+2
Clojure

{{refer}}是{{require}}、{{use}}和{{refer-clojure}}用例的基础,并且在复制符号/变量映射从一个命名空间到另一个命名空间的主要工作中并不特别高效。

方法:可以做出的改进
- 直接访问命名空间映射,避免创建过滤的中间映射(ns-publics)
- 使用临时映射构建对`refer`的引用
- 与`cas`每个新的引用单独操作不同,构建所有更改的映射,然后进行`cas`
- 对于`:require :only ...`情况 - 只遍历包含的变量,而不是遍历所有引用的变量,然后查找每个变量

虽然还有更多显著的变化(例如不可变命名空间)可以使性能进一步提升,但我尝试让本次更改的范围尽量小。

虽然单个`refer`的计时大大减少(`(refer clojure.core)`减少约50%,`:only`使用减少约90%),但是`refer`只是更广泛的`require`加载时间的一个小部分,因此在实践中的改进是有限的。

性能

| 新repl中的expr | 1.7.0-beta3 | 1.7.0-beta3+patch |
| :-- | :-- | :-- | :-- |
| (in-ns 'foo) (clojure.core/refer 'clojure.core) | 2.65 ms | 0.994 ms |
| (in-ns 'bar) (clojure.core/refer 'clojure.core :only '(link: inc dec)) | 1.04 ms | 0.113 ms |
| (use 'criterium.core) | 0.877 ms | 0.762 ms |
| (require '(link: clojure.core.async :refer (>!! <!! chan close!))) | 3408 ms | 3302 ms |

补丁:clj-1730-2.patch

筛选说明

补丁似乎正确,但我们应该考虑

  • 非习惯性的使用{{if}}代替{{when}}使分支难以阅读
  • 非习惯性的{{if}}缩进(两个分支在同一行)难以阅读
  • 我不认为找不到应是一个{{IllegalAccessError}},但原始代码已经这样做,所以...
  • 围绕swap的乐观并发循环将永远不会放弃,这好吗?

3条答案

0

评论者:alexmiller

补丁更新以解决第一个筛选评论。实际上我没有找到第二个的情况?给我一个提示。

0

评论者:gshayban

我认为这对峰值性能的影响不会很大。根据附上的clojure.instant加载图片,这个补丁可能可以减少一点启动时间。

(由Bytestacks制作图片,今天是JDK11的调试构建的配置记录)

0
参考:[https://clojure.atlassian.net/browse/CLJ-1730](https://clojure.atlassian.net/browse/CLJ-1730)(由alexmiller报告)
欢迎来到Clojure问答社区,您可以在这里提问,并从Clojure社区成员那里获得答案。
...