欢迎!请参阅关于页面以了解该功能的更多信息。
如果merge使用瞬态会更好。
补丁 - clj-1458-7.patch
方法 在transients和reduce之后将c.c/merge迁移到核心中。保留旧版本作为merge1,供新定义之前使用。让APersistentMap/conj和ATransientMap/cons知道IKVReduce。
附带的补丁保留了merge的两个现有行为- 元数据传播- 合并的右侧可以是Map.Entry、size=2的IPersistentVector和常规映射。
筛选方
评论者:jawolfe
我今天会尝试修复这个补丁。
这个补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就在那里,并且显然可以从瞬态中受益)使用瞬态。
可能存在三个问题- 由于依赖瞬态和相关函数,我不得不移动这些函数。我假设这比向前声明更可取。这是我能找到的最佳位置,但乐于将其移动到其他位置。- 我添加了多个arity,以避免对瞬态单个参数可能产生的性能开销。愿意取消此操作,如果所需。- 由于瞬态映射不支持contains?(或find),我不得不稍微修改merge-with中的逻辑。
评论者:michalmarczyk
我在2012年5月30日就为{{zipmap}}提交了一个单独的ticket(补丁),编号为CLJ-1005.
哎呀,如果我有越界的地方,我很乐意从这个补丁中移除那个更改,这能简化事情的话——请告诉我。
评论者:gshayban
提供了一种备选方法,即在协议加载完成后再延迟合并,然后使用transducers。
评论者:michaelblume
看起来你执行了两次(获取m k)— 难道不应该在局部变量中放进去吗?
呃,我的意思是,我说的“抛出”这个词用得不好。
是的,那是那个 — 一旦CLJ-700被提交,将不再使用get。
我们应该添加性能测试。合并两个、三个、很多地图,以及合并时根据地图大小变化,为merge-with改变碰撞百分比。
需要回到(某个身份)逻辑,否则来自除了提供的第一张地图之外的其他地图会传播元数据。我会稍后修复。
我不知道这是否应该被允许,但这会引发错误
(合并 {} (链接: :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使用了几次,但看到没有测试的目的是测试它们的行为的。