欢迎!请参阅关于页面以获取更多关于如何从事这一工作的小信息。
如果合并使用临时对象会很好。
补丁 - clj-1458-7.patch
方法 在核心库中将c.c/merge迁移到transients和reduce之后。将旧版本留下作为merge1,用于需要旧定义的情况。让APersistentMap/conj和ATransitionMap/cons意识到IKVReduce。
附带的补丁保持merge的两个现有行为- 元数据传播- 合并的右侧可以是一个Map.Entry、大小为2的IPersistentVector和常规映射。
由
评论者:jawolfe
我今天将尝试做这个补丁。
这个补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就在那里,而且显然可以从transients中获益)使用transients。
三个潜在问题- 我不得不移动函数,因为它们依赖于transient和朋友们。我假设这与前置声明更受欢迎。这是我能找到的最好地方,但愿意将它们移动到其他地方。- 我添加了多个arity,以避免对单个参数进行transient操作可能导致的性能成本。根据需要愿意撤销。- 我必须稍微改变merge-with中的逻辑,因为transient映射不支持contains?(或find)。
评论者:michalmarczyk
我在2012年5月30日为{{zipmap}}单独提交了一份带有补丁的工单:CLJ-1005。
哦,抱歉如果我越界了。如果您认为这样会让事情更简单,我很乐意从这次补丁中去除该更改——请您告诉我。
评论者:gshayban
附上了一种替代方法,推迟合并直到协议加载后,然后使用transducers。
评论者:michaelblume
看起来您重复执行了(get m k)两次 — 难道这不应该是局部执行吗?
呃,我把"put"放在局部,我的意思是,“throw”这个词选得不好。
是的就这样 — 在CLJ-700提交后不会使用get了。
我们还应该添加性能测试。合并两个图、三个、许多图,以及改变图的大小,对于merge-with,改变冲突的百分比。
需要回到(some 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,但我看不到任何测试目的是测试它们的行为。