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

欢迎!请参阅关于页面以了解更多此网站的工作方式。

+1 点赞
Clojure

如果merge使用transients来优化会更好。

补丁
- clj-1458-7.patch

方法
核心后面的cc/merge迁移,在transients和reduce之后。保留旧版本merge1以用于先于新定义的情况。使APersistentMap/conj和ATransientMap/cons了解IKVReduce。

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

由谁筛选

25 个答案

0 点赞

评论者:jawolfe

我今天将尝试这个补丁。

0 点赞

评论者:jawolfe

此补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就在那里,并且显然也可以从transients中受益)使用transients。

三个潜在问题
- 由于函数依赖于transient及其相关函数,我必须移动这些函数。我认为这比向前声明更可取。这是我能找到的最佳位置,但乐于将其移动到其他地方。
- 我增加了多个参数数量,以避免单参数进行transient化时可能出现的性能成本。如果需要,我会取消此操作。
- 为了适应transient映射不支持contains?(或find),我不得不稍微修改merge-with中的逻辑。

0 点赞

评论者:michalmarczyk

我于2012年5月30日为{{zipmap}}发布了一个单独的票据,包含补丁:CLJ-1005。

0 点赞

评论者:jawolfe

啊,如果那时我越界了,我很抱歉。如果这个修改从这个补丁中移除可以简化事物,我很乐意这么做——只要告诉我。

0 点赞

评论者:gshayban

附加一个替代方法,延迟合并直到协议加载之后,然后使用transducers。

0 点赞

评论者:michaelblume

看起来你在做(get m k)两次——这不应该抛入局部变量中吗?

0 点赞

评论者:michaelblume

呃,我的意思是,'throw'这个词用得不好。

0 点赞

评论者:gshayban

是的,那就是——在CLJ-700提交后,将不再使用get。

我们应该添加性能测试。合并两个映射,三个,许多映射,以及修改映射的大小,对于with merge,则修改碰撞的百分比。

我们需要回到(某些身份)逻辑,否则除了第一个提供的映射之外的元数据会传播。我将稍后修复。

0 点赞

评论者:michaelblume

我不知道这是否应该是允许的,但它崩溃了

(merge {} (link: :foo 'bar))

这在 compojure-api 中广泛使用

0 点赞
0 点赞

评论者:michaelblume

Ghadi,contains? 在底层使用 get,所以它仍然是两次 get,对吧?看起来坚持使用 ::none 技巧绩效会更好。

0 点赞

评论人:bronsa

这需要 if-let + find。

0 点赞

评论者:gshayban

新的补丁解决了目前的问题

0 点赞

评论者:gshayban

CLJ-1458-transient-merge3.patch 删除了愚蠢的内联宏,改用单例函数。

0 点赞

评论者:michaelblume

很好的 =)

这应该附带测试。如果我们想保留与 MapEntry 合并的能力,我们应该测试它。这与其说是补丁的弱点,不如说是现有测试的弱点。我在测试套件中看到 merge 和 merge-with 被使用了几次,但我看不到任何测试其目的是测试行为的测试。

...