请分享您的想法,参加Clojure 2024状态调查!

欢迎!请查看关于页面以获取更多关于这个功能的信息。

–1
集合

如邮件列表中讨论的(链接:1),这个补丁有两个向量地图的不roll展开版本,每个基数都有特殊的内部类。目前这两个都增长到六个元素,然后溢出到一般的数据结构版本中,这是基于粗略测试的,但可以很容易地改变。根据Rich的要求,我没有将其集成到其他代码中,而是为每个创建了顶层静态 create() 方法。

这个补丁的唯一原因是性能,无论是在创建数据结构上还是在对其进行操作上。这可以看作是当前在 PersistentArrayMap 溢出到 PersistentHashMap 中应用的技巧的更冗余的版本。根据基准测试(可以通过克隆 cambrian-collections(链接:2)并运行 'lein test :benchmark' 来执行),这应该取代 PersistentArrayMap。性能至少与 PAM 相当,有时要快得多。特别值得注意的是创建时间,对于所有大小的映射都是 5 倍更快(运行 'lein test :only cambrian-collections.map-test/benchmark-construction'),3 向量相仿,但 5 向量快 20 倍。对哈希和相等性计算以及 reduce() 调用也有类似的收益。

这是一个大补丁(超过 5k 行),将很难进行审查。我关于正确性的假设是基于 collection-check 的使用以及底层方法非常简单的现实。尽管如此,我很乐意提供关于采取的方法的概述,如果这有助于审查过程。

我希望能把它整合到1.7中,所以请告诉我我能做什么来帮助实现这一点。

(链接:1) https://groups.google.com/forum/#!topic/clojure-dev/pDhYoELjrcs
(链接:2) https://github.com/ztellman/cambrian-collections

补丁: unrolled-vector-2.patch

审查者说明: 方法清晰易懂。鉴于生成的代码量很大,我认为最好的方法是尽快让人们使用它,并将 collection-test(链接:3)添加到 Clojure 测试套件中。我也希望将生成器(链接:4)包含在 Clojure 存储库中。我们不一定需要自动化运行它,但如果我们想稍后进行修改,最好将它放在附近。

(链接:3) https://github.com/ztellman/collection-check/blob/master/src/collection_check.clj
(链接:4) https://github.com/ztellman/cambrian-collections/blob/master/generate/cambrian_collections/vector.clj

43 个回答

0
_由hypirion发表的评论:

注意,本补丁将使{{core.rrb-vector}}在某些小向量上失效,因为它检查了底层结构。这也将使其他查看向量实现内部的库失效,尽管我不了解任何其他的,当然也不是其他的贡献库。

关于{{unrolled-vector.patch}}的两点评论

{{private *transient* boolean edit = true;}}
在Transient类中可能应该是
{{private *volatile* boolean edit = true;}}
因为在Java中transient的意义完全不同。

在{{Transient}}实现中的{{conj}}如果转换成{{TransientVector}}(即溢出)可能无需任何问题({{edit = false;}})而自行失效——除非它有一个明显的开销。失效可以防止一些涉及错误transient使用的微妙错误。
0

评论由:alexmiller发表

Jean - 了解此补丁影响的范围将是该补丁集成过程的一部分。感谢提前告知。虽然我们试图尽量减少这样的破坏,但对于依赖于实现内部的库,这可能是不可避免的。

0
_评论由:michalmarczyk发表

一旦它们落入master分支,我将立即为{{core.rrb-vector}}添加对unrolled向量的支持。:-)(可能使用一些条件编译,以便不与Clojure早期版本的兼容性中断——我们将看看情况。)
0

评论由:michalmarczyk发表

我应该指出,通过线性时间将这些"类似向量"倒入常规向量,可以添加对任何"类似向量"的通用支持。乍一看,这似乎与库的基本承诺不符,但我将在实际更改落地之前对此多做思考。

0

评论由:ztellman制作

不出所料,在我切下上一个补丁的第二天,有人发现了一个问题(链接:1)。简而言之,我对ArrayChunk包装器的使用两次应用了偏移量。

这没有被collection-check捕获,该检测器已被更新以捕获这种特定的失败。然而,Michael Blume尝试将更改合并到Clojure中时,意外地揭示了这个问题,这使得Clojure测试套件中的一系列警报响起。我自己尝试进行相同的“证明”操作是在我添加了分块序列功能之前,因此这个问题一直延续到至今。

像往常一样,可能还有更多的问题潜伏。我希望我们能够在现在和1.8之间尽可能多地让目光投入到代码上。

(链接:1) https://github.com/ztellman/cambrian-collections/commit/2e70bbd14640b312db77590d8224e6ed0f535b43
(链接:2) https://github.com/MichaelBlume/clojure/tree/test-vector

0

评论由:ztellman制作

作为未展开的map问题性能分析的配套,我已运行基准测试并将结果显示在https://gist.github.com/ztellman/10e8959501fb666dc35e。一些值得注意的结果

0

评论由:alexmiller发表

Stu:我认为这个补丁不应该被标记为“已筛选”,除非实际的集成和构建工作(如果集成了生成器)已经完成。

0

评论由:alexmiller发表

通知:我们目前暂时“重置”了1.8的所有大功能(除了socket repl工作)。我们仍然可能包含它——这笔钱的确定将在后来进行。

0

评论由:ztellman制作

好的,有什么想法什么时候会做出决定?我高兴地看到我们似乎终于要在这个问题上取得进步。

0

评论由:alexmiller发表

不是,但它现在在我的工作列表上了。

0

评论者:richhickey

我想知道所有对APersistentVector的覆盖是否能带来重要的好处 - 例如迭代器、hashCode等。

0

评论由:ztellman制作

在hashCode的情况下,绝对是:https://gist.github.com/ztellman/10e8959501fb666dc35e#file-gistfile1-txt-L1013-L1076。这实际上是我最初想要加速的事情之一。

在迭代器的情况下,可能不是。我会去掉它。

0

评论由:ztellman制作

我是不是应该从https://github.com/clojure/clojure/commit/36d665793b43f62cfd22354aced4c6892088abd6中推断出这个问题已经不存在了?如果是这样,我认为还有很多改进被摆在那里没有任何原因。

0

评论者:richhickey

是的,这个提交涵盖了这一功能。它与补丁不同,从一个小核心构建起来,并最大化基础改进,而不是在每个类中有大量的冗余定义。这也允许立即集成,而不必过于担心正确性,因为新代码很少。它还强调了元组的用例,例如作为值使用的小向量,不会改变,从而降低了“可变”函数的优先级。我不同意许多必要改进被省略的说法。这个补丁“优化”了很多无关紧要的事情。此外,对外部化的优化也不是很大的改进。此外,提交中包含的集成工作只占补丁大小的一小部分。总的来说,要使补丁符合这种方法,会比直接完成所有工作的来回往更费时,但我感谢灵感和推动 - 谢谢!

0

评论者:richhickey

尽管如此,这个提交不必是最后一言——它可以作为进一步优化的基线。但我更希望它是由需求驱动的。Clojure 可能会因为优化不重要的事情而变得高达 10 倍以上。

...