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

欢迎!请参阅关于页面以获取有关这个工作方式的更多信息。

+1
Clojure

如果合并使用临时对象会很好。

补丁
- clj-1458-7.patch

方法
迁移 c.c/merge 到核心库中,在 transients 和 reduce 之后。保留旧版本作为 merge1,以便在下一个新定义之前使用。让 APersistentMap/conj 和 ATransientMap/cons 意识到 IKVReduce。

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

经审核

25 个回答

0

评论者:michaelblume

这是一个非常简单的合并测试,我们需要的不仅仅是这个,但这是一个起点

0

评论者:alexmiller

clj-1458-4.patch 更新到 master,无更改。

0

评论者:gshayban

我想重新评估这个工单的范围。我们能否只处理'合并',并推迟'与...合并'?到目前为止,这仍然是更常见的功能。我已经附上了一个新的简化补丁。

0

评论者:gshayban

CLJ-1458-6.patch又是一个更清晰的解决方案

0

评论者:alexmiller

请更新工单方案部分,讨论APersistentMap.cons / ASSOC的变化。此外,请为一些常见情况添加一个前/后性能测试。

0

评论者:michaelblume

更新补丁,以处理在core中定义前在core_print中使用merge的情况

0

评论者:gshayban

如果有人想接管这个项目,那就去吧。我在这个项目上遇到了让性能稳定提升的困难。显然,这需要新的基准测试。

0

评论者:alexmiller

是的,这需要一个基准测试来展示可证明的改进。这里的目标完全是提高性能——如果我们不能证明它始终更快,那么甚至不需要审查它。

0

评论者:gshayban

这个工单需要帮助。第0步是编写一个基准测试框架,该框架模拟各种大小的映射以及下面的各种多态参数。

基准测试框架之后,实现代码需要保留这种行为
- 如果第一个参数不是nil,其元数据会传播到结果中。
- 参数可以是Map.Entry,大小为2的IPersistentVector,以及常规映射。
- 如果第一个参数不是映射(map),则结果未定义。

0
参考: https://clojure.atlassian.net/browse/CLJ-1458(由 alex+import 报告)
...