欢迎!请参阅关于页面以了解更多此网站的工作方式。
如果merge使用transients来优化会更好。
补丁 - clj-1458-7.patch
方法 核心后面的cc/merge迁移,在transients和reduce之后。保留旧版本merge1以用于先于新定义的情况。使APersistentMap/conj和ATransientMap/cons了解IKVReduce。
附加的补丁保留merge的两种现有行为- 元数据传播- 合并的右手边可以是Map.Entry,大小为2的IPersistentVector和常规映射。
由谁筛选
评论者:jawolfe
我今天将尝试这个补丁。
此补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就在那里,并且显然也可以从transients中受益)使用transients。
三个潜在问题- 由于函数依赖于transient及其相关函数,我必须移动这些函数。我认为这比向前声明更可取。这是我能找到的最佳位置,但乐于将其移动到其他地方。- 我增加了多个参数数量,以避免单参数进行transient化时可能出现的性能成本。如果需要,我会取消此操作。- 为了适应transient映射不支持contains?(或find),我不得不稍微修改merge-with中的逻辑。
评论者:michalmarczyk
我于2012年5月30日为{{zipmap}}发布了一个单独的票据,包含补丁:CLJ-1005。
啊,如果那时我越界了,我很抱歉。如果这个修改从这个补丁中移除可以简化事物,我很乐意这么做——只要告诉我。
评论者:gshayban
附加一个替代方法,延迟合并直到协议加载之后,然后使用transducers。
评论者:michaelblume
看起来你在做(get m k)两次——这不应该抛入局部变量中吗?
呃,我的意思是,'throw'这个词用得不好。
是的,那就是——在CLJ-700提交后,将不再使用get。
我们应该添加性能测试。合并两个映射,三个,许多映射,以及修改映射的大小,对于with merge,则修改碰撞的百分比。
我们需要回到(某些身份)逻辑,否则除了第一个提供的映射之外的元数据会传播。我将稍后修复。
我不知道这是否应该是允许的,但它崩溃了
(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 被使用了几次,但我看不到任何测试其目的是测试行为的测试。