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

欢迎!有关如何使用本站的信息,请参阅关于页面。

+1
Clojure
关闭

'zipmap'构建了一个没有transients的映射,where transients可以改善性能。

方法:内部使用transient映射,以及键和值的迭代器。像以前一样返回持久映射。定义也被移动,以便它位于#'transient'下方。

性能

(def xs (range 16384))
(def ys (range 16))

| 表达式 | 1.7.0-beta3 | +补丁 | |
| :-- | :-- | :-- | :-- | :-- |
| (zipmap xs xs) | 4.50 毫秒 | 2.12 毫秒 | 大映射
| (zipmap ys ys) | 2.75 微秒 | 2.07 微秒 | 小映射

补丁:CLJ-1005-zipmap-iterators.patch

审核者:Alex Miller

备注关闭:已修复在1.10.2-rc1中

13 个回答

0

评论者:aaron

为什么遗留了旧实现并注释掉了?如果我们将要转向新的实现,旧的一个应该被移除。

0

评论者:michalmarczyk

如票据描述中所述,之前附加的补丁类似于into的非transient启用定义,仍然留在core.clj中,前面带有#_ -- 我不确定这是否在所有情况下都是期望的。

这是一个移除了旧实现的新补丁。

0

评论由:jafingerhut添加

感谢您更新了补丁,Michal。很抱歉提出这样一个小问题,但您能否为更新的补丁使用不同的名称?我知道JIRA可以处理同名多个附件,但我的预筛选代码还不够聪明,这可能会在讨论补丁时引起混淆。

0

评论者:michalmarczyk

感谢您的提醒,Andy!我已经将新补丁以新名称重新附加。

0

评论由:jafingerhut添加

在Michal的更新补丁添加后,冒昧地将批准从“不完整”改回“无”,解决导致 bounty 标记为“不完整”的原因。

0

评论者:aaron

补丁看起来不错,应用很干净。我们还需要运行哪些额外测试来验证它是否提供了我们期望的改进。此外,是否有某个讨论开始了这个 b indem?

0

评论者:michalmarczyk

嗨Aaron,

感谢您对此事的关注!

根据我能观察到的,这个更改大大提高了大映射的{{zipmap}}时间。对于小映射,有细微的改进。以下是两个基本的Criterium基准测试({{transient-zipmap}}在REPL中定义为补丁中所示)

`
;;大映射
user=> (def xs (range 16384))

'user/xs

user=> (last xs)
16383
user=> (c/bench (zipmap xs xs))
评估次数:13920,在60个样本中,每个样本232次调用。

         Execution time mean : 4.329635 ms
Execution time std-deviation : 77.791989 us

执行时间下四分位数:4.215050 ms(2.5%)
执行时间上四分位数:4.494120 ms(97.5%)
nil
user=> (c/bench (transient-zipmap xs xs))
评估次数:21180,在60个样本中,每个样本353次调用。

         Execution time mean : 2.818339 ms
Execution time std-deviation : 110.751493 us

执行时间下四分位数:2.618971 ms(2.5%)
执行时间上四分位数:3.025812 ms(97.5%)

在60个样本中找到了2个异常值(3.3333%)

low-severe	 2 (3.3333 %)

异常值方差:25.4675%,方差由异常值适度膨胀
nil

;;; 小型图
用户=> (定义 ys (range 16))

'用户/ys

用户=> (last ys)
15
用户=> (c/bench (zipmap ys ys))
评估次数:60个样本中277317次调用,共16639020次。

         Execution time mean : 3.803683 us
Execution time std-deviation : 88.431220 ns

执行时间下四分位数:3.638146微秒(2.5%)
执行时间上四分位数:3.935160微秒(97.5%)
nil
用户=> (c/bench (transient-zipmap ys ys))
评估次数:60个样本中308948次调用,共18536880次。

         Execution time mean : 3.412992 us
Execution time std-deviation : 81.338284 ns

执行时间下四分位数:3.303888微秒(2.5%)
执行时间上四分位数:3.545549微秒(97.5%)
nil
`

很明显,只要瞬态满足其合同,语义就得到了保留。

可能我没有启动ggroup线程,对此表示歉意。

0

评论由:jafingerhut添加

2012年8月15日发布的补丁0001-Use-transient-map-in-zipmap.2.patch无法干净地应用至2014年9月3日对Clojure进行一些提交后的最新master上。

我尚未检查此补丁是否易于更新。有关如何更新补丁的建议,请参阅http://dev.clojure.org/display/community/Developing Patches中的“更新过时的补丁”部分。

0
_由 michalmarczyk 添加注释

谢谢,Andy。更新很简单 - 自动变基。这是更新后的补丁。
0

由 gshayban 添加注释

使用 clojure.lang.RT/iter 的新补丁,在最佳情况下提高了 >30% 的性能。分配减少,但我没有进行测量。CLJ-1499(更好的迭代器)相关

0

由 justinspedding 添加注释

4年后,这个核心命名空间中的zipmap实现仍未使用瞬态映射。为什么一直未应用此实现?

0
_由 alexmiller 添加注释

在此提出了多种方法,但尚未确定共识方法。需要一些专注的时间来进行缩小,并且尚未成为一项优先任务。
0
参考: https://clojure.atlassian.net/browse/CLJ-1005(由 michalmarczyk 提出)
...