2024州 Clojure调查中分享您的想法!

欢迎!请参阅关于页面获取有关如何使用本网站的更多信息。

–1
集合

如邮件列表中讨论的(链接:1),此补丁包含向量和映射的两个展开变体,每个基数都有特殊的内部类。目前两者增长到六个元素后才会溢出到通用数据结构版本,这是基于粗略测试,但可以轻松更改。应 Rich 请求,我没有将其集成到其他代码中,并对每个都要有顶层静态 create() 方法。

此补丁的唯一原因是为了性能,无论是创建数据结构还是对其执行操作。这可以被视为当前在 PersistentArrayMap 溢出到 PersistentHashMap 中操作的技巧的更冗长版本。根据benchmarks,可以通过复制 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;}}
因为 transient 在 Java 中的含义完全不同。

{{conj}}在{{Transient}}实现中的确可以在没有任何问题的情况下({{edit = false;}})使自身无效——如果它被转换为 TransientVector(即溢出)——除非它有显著的性能开销。这种无效化可以防止一些与错误使用 transient 相关的微妙错误。
0

评论由:alexmiller 发布

Jean - 理解此补丁的影响范围无疑是此类补丁集成过程的一部分。我很感激提前通知。尽管我们试图尽量减少此类情况的破坏性,但对于依赖实现内部结构的库来说,这可能无法避免。

0
_评论由:michalmarczyk 发布

一旦他们在 master 上发布,我就会为{{core.rrb-vector}}添加对非展开矢量的支持。:-) (可能包含一些条件编译,以便与 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发表的评论

作为未压缩映射问题性能分析的补充,我已经运行了基准测试,并在https://gist.github.com/ztellman/10e8959501fb666dc35e上发布了结果。一些值得关注的结果

  • conj比通用向量快3倍:[点击查看](https://gist.github.com/ztellman/10e8959501fb666dc35e#file-gistfile1-txt-L329-L451)
  • reduce +比通用向量快3倍:[点击查看](https://gist.github.com/ztellman/10e8959501fb666dc35e#file-gistfile1-txt-L795-L887)
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)。这实际上是我想加速的最初几件事之一。

在iterator的情况下,可能不是。我会很开心移除它。

0

由:ztellman发表的评论

我是不是应该从[链接](https://github.com/clojure/clojure/commit/36d665793b43f62cfd22354aced4c6892088abd6)推断出这个问题已关闭?如果是这样,我认为还有一些改进被放到一边没有任何特定原因。

0

评论者:richhickey

是的,这个提交涵盖了这项功能。它与增量修补方法不同,从一个小核心构建,并最大化对基础的改进,而不是为每个类提供大量冗余的定义。这也允许立即集成,不必过多关注正确性,因为新代码很少。而且,它强调了元组的用例,例如作为值使用的小向量不需要更改,因此降低了“可变”函数的重要性。我不同意许多必要的改进被忽略的说法。这个修补程序把许多不重要的事情进行了优化。此外,对普遍内联的改进不大。此外,提交中包含的集成工作量只是修补程序大小的一小部分。总体而言,要使修补程序符合这种方法,需要更多的来回改动,但我很欣赏这种灵感和启示——谢谢!

0
by

评论者:richhickey

话虽如此,这个提交不需要是最后的话——它可以作为一个进一步优化的基本点。但我更愿意让需要驱动这个过程。Clojure可能会因为优化不重要的事情而变得太大。

...