欢迎!请查看关于页面以获取更多关于如何使用本网站的信息。
如果merge使用transient会更好。
补丁 - clj-1458-7.patch
方法 在core中将c.c/merge迁移到transient和reduce之后。保留旧版本作为merge1用于先于新定义的场景。让APersistentMap/conj和ATransientMap/cons了解IKVReduce。
附带的补丁保留了merge的两个现有行为- 元数据传播- 合并的右边可以是一个Map.Entry、大小为2的IPersistentVector以及常规映射。
由谁审查
评论者:jawolfe
我将在今天尝试修复这个补丁。
这个补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就在那里并且也可以从transients中受益)使用transient。
三个潜在问题- 由于这些函数依赖于transient和好友,我不得不移动它们。我假设这比前向声明更好。这是我找到的最好的位置,但如果需要,我愿意将它们移到其他地方。- 我添加了多个arity,以避免将单个参数transient化的潜在性能代价。如果需要,我愿意撤销这一变更。- 我必须稍微更改merge-with中的逻辑,因为transient映射不支持contains?(或find)。
评论由:michalmarczyk
我在2012年5月30日为{{zipmap}}单独提交了包含补丁的工单:CLJ-1005。
啊,如果我不小心越界了,那么我很乐意从这个补丁中删除这个更改——只是告诉我。
评论由:gshayban
附加了另一种方法,在加载协议之后延迟合并,然后使用transducers。
评论由:michaelblume
看起来你重复做了(获取m k)——这不是应该放在局部变量中吗?
啊,我没有说“抛出”——这是个糟糕的用词。
是的,那是个问题——在CLJ-700提交之后再也不会使用get了。
我们还应该添加性能测试。合并两个、三个、很多地图,以及根据地图的大小变化,以及对于合并操作,根据冲突百分比变化。
需要返回到(某些identity)逻辑,否则元数据会从除了提供的第一个地图之外的其他地图传播。我会稍后修正。
我不知道这是否应该是允许的,但这会中断
(merge {} (link: :foo 'bar))
这是在 compojure-api 中广泛使用的
https://github.com/metosin/compojure-api/blob/0.16.6/src/compojure/api/meta.clj#L198
Ghadi,contains?在幕后使用get,因此它仍然是两次get,对吗?这似乎意味着坚持使用::none技巧将更高效。
由:bronsa 发布的评论
这需要if-let + find。
针对迄今为止的关注点提出了新补丁
CLJ-1458-transient-merge3.patch删除了愚蠢的内联宏,使用单例函数代替。
好 =)
这应该附带测试。如果我们想保留与MapEntry合并的能力,我们应该对其进行测试。这不是补丁的弱点,而是现有测试的弱点。我看到在测试套件中多次使用了merge和merge-with,但我看不到用来测试它们行为的测试。