Patchwork [2,of,2,V2] dicthelpers: inline diff and join code

login
register
mail settings
Submitter Siddharth Agarwal
Date March 29, 2013, 11:10 p.m.
Message ID <09c59145b36d833728e3.1364598636@sid0x220>
Download mbox | patch
Permalink /patch/1224/
State Accepted
Commit 40c679748fa9736d773859696adae9501078af33
Headers show

Comments

Siddharth Agarwal - March 29, 2013, 11:10 p.m.
# HG changeset patch
# User Siddharth Agarwal <sid0@fb.com>
# Date 1364598477 25200
#      Fri Mar 29 16:07:57 2013 -0700
# Node ID 09c59145b36d833728e3d5639e149b94fc813981
# Parent  c1167c0f2bf3d31e2492af0b45803bc4d874502e
dicthelpers: inline diff and join code

mpm suggested this change since it improves performance slightly.

Benchmarking hg perfcalculate -r .

Before:
! wall 0.141173 comb 0.140000 user 0.140000 sys 0.000000 (best of 66)

After:
! wall 0.138619 comb 0.140000 user 0.140000 sys 0.000000 (best of 69)
Bryan O'Sullivan - April 1, 2013, 8:56 p.m.
On Fri, Mar 29, 2013 at 4:10 PM, Siddharth Agarwal <sid0@fb.com> wrote:

> dicthelpers: inline diff and join code
>

Both patches crewed, thanks.

Patch

diff --git a/mercurial/dicthelpers.py b/mercurial/dicthelpers.py
--- a/mercurial/dicthelpers.py
+++ b/mercurial/dicthelpers.py
@@ -5,20 +5,46 @@ 
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-def _diffjoin(d1, d2, default, compare):
+def diff(d1, d2, default=None):
+    '''Return all key-value pairs that are different between d1 and d2.
+
+    This includes keys that are present in one dict but not the other, and
+    keys whose values are different. The return value is a dict with values
+    being pairs of values from d1 and d2 respectively, and missing values
+    represented as default.'''
     res = {}
-    if d1 is d2 and compare:
+    if d1 is d2:
         # same dict, so diff is empty
         return res
 
     for k1, v1 in d1.iteritems():
         if k1 in d2:
             v2 = d2[k1]
-            if not compare or v1 != v2:
+            if v1 != v2:
                 res[k1] = (v1, v2)
         else:
             res[k1] = (v1, default)
 
+    for k2 in d2:
+        if k2 not in d1:
+            res[k2] = (default, d2[k2])
+
+    return res
+
+def join(d1, d2, default=None):
+    '''Return all key-value pairs from both d1 and d2.
+
+    This is akin to an outer join in relational algebra. The return value is a
+    dict with values being pairs of values from d1 and d2 respectively, and
+    missing values represented as default.'''
+    res = {}
+
+    for k1, v1 in d1.iteritems():
+        if k1 in d2:
+            res[k1] = (v1, d2[k1])
+        else:
+            res[k1] = (v1, default)
+
     if d1 is d2:
         return res
 
@@ -27,20 +53,3 @@  def _diffjoin(d1, d2, default, compare):
             res[k2] = (default, d2[k2])
 
     return res
-
-def diff(d1, d2, default=None):
-    '''Return all key-value pairs that are different between d1 and d2.
-
-    This includes keys that are present in one dict but not the other, and
-    keys whose values are different. The return value is a dict with values
-    being pairs of values from d1 and d2 respectively, and missing values
-    represented as default.'''
-    return _diffjoin(d1, d2, default, True)
-
-def join(d1, d2, default=None):
-    '''Return all key-value pairs from both d1 and d2.
-
-    This is akin to an outer join in relational algebra. The return value is a
-    dict with values being pairs of values from d1 and d2 respectively, and
-    missing values represented as default.'''
-    return _diffjoin(d1, d2, default, False)