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

欢迎!请参阅关于页面,了解更多关于这个功能的信息。

+1
Clojure

如果merge使用transients会更好。

补丁
- clj-1458-7.patch

方法
在核心库中迁移c.c/merge到transients和reduce之后。保留旧的版本作为merge1,用于在新定义之前的情况。使APersistentMap/conj和ATransitionMap/conn了解IKVReduce。

附带的补丁保留了merge的两个现有行为
- 元数据传播
- 合并的右侧可以是Map.Entry、大小为2的IPersistentVector和普通映射。

25回答

0

评论由:michaelblume做出

这是一个极其简单的合并测试,但我们需要更多的东西,这是开始

0

评论由:alexmiller做出

clj-1458-4.patch刷新并应用于master,没有更改。

0

评论由:gshayban做出

我想重新评估这个工单的范围。我们可以只处理'merge',并将'merge-with'推迟吗?这无疑是一个更常见的功能。我已经附上了一个新的简化补丁。

0

评论由:gshayban做出

CLJ-1458-6.patch 是另一种更简洁的方案

0

评论由:alexmiller做出

请更新任务卡的方案部分,讨论 APersistentMap.cons / ASSOC 的更改。另外,请为一种或多种常见案例添加性能测试的前/后对比?

0

评论由:michaelblume做出

更新补丁以处理 core_print 中的 merge 使用,在 core 中还没有定义之前

0

评论由:gshayban做出

如果有人愿意承担这项工作,请继续。我在这一方面遇到了统一性能改进的困难。显然,这需要新的基准测试。

0

评论由:alexmiller做出

是的,这需要一个基准测试来展示可证明的改进。这里的整体目标是提高性能 - 如果我们不能证明它持续更快,那么审查它都没有意义。

0

评论由:gshayban做出

此任务卡需要帮助。第 0 步是编写一个基准测试驱动程序,该程序锻炼各种大小的映射以及以下各种多态参数。

在基准测试驱动程序之后,实现代码需要保留这种行为
- 如果第一个参数不是 nil,则其元数据传播到结果中。
- 参数可以是 Map.Entry、size=2 的 IPersistentVector 以及常规映射。
- 当传递非映射作为第一个参数时,结果未定义。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1458](https://clojure.atlassian.net/browse/CLJ-1458)(由alex+import提出)
...