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

欢迎!请参阅关于我们页面,了解关于本站工作方式的更多信息。

+1
Clojure
已关闭

'zipmap'构建了一个不使用transients的映射,而transients可以提高性能。

方法:内部使用transient映射,以及键和值迭代器。仍然返回持久映射。定义也被移动,使其位于#'transient'定义下方。

性能

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

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

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

筛分者:Alex Miller

以以下注释放置关闭: 已在1.10.2-rc1中修复

13 个回答

0

评论由:aaron

为什么保留了旧的实现并加上了注释?如果我们打算迁移到新的实现,那么应该移除旧的实现。

0

评论由:michalmarczyk

如问题描述中所述,之前附加的补丁遵循的样式是在core.clj中以#_开头的定义的非瞬态启用 -- 我不确定这是否在所有情况下都是期望的内容。

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

0

评论人:jafingerhut

Michal,感谢您更新了补丁。很抱歉提出这样一个小问题,但您能否将更新后的补丁命名为其他名称?我知道JIRA可以处理具有相同名称的多个附加文件,但我的预筛选代码还不够聪明,这可能会在讨论补丁时导致混淆。

0

评论由:michalmarczyk

Andy,谢谢您的提醒!我已经用一个新名称重新附加了新的补丁。

0

评论人:jafingerhut

在没有 Michal 更新补丁的情况下,我未经授权将审批状态从“不完整”改回“无”,解决了导致该问题标记为“不完整”的原因。

0

评论由:aaron

补丁看起来不错,且应用良好。我们是否应该运行其他测试以验证这个补丁是否提供了我们期望的改进。此外,有无地方讨论了这个创建这个问题的原因?这里没有太多的上下文。

0

评论由:michalmarczyk

Hi 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毫秒(2.5%)
执行时间上四分位数:4.494120毫秒(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毫秒(2.5%)
执行时间上四分位数:3.025812毫秒(97.5%)

在60个样本中有2个异常值(3.3333%)

low-severe	 2 (3.3333 %)

异常值影响:25.4675% 异常值使得方差适度膨胀
nil

;; 小图
用户=> (def 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

补丁 0001-Use-transient-map-in-zipmap.2.patch 于 2012 年 8 月 15 日创建,在 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
by
参考:https://clojure.atlassian.net/browse/CLJ-1005(由michalmarczyk报告)
...