dicthelpers: inline diff and join code
authorSiddharth Agarwal <sid0@fb.com>
Fri, 29 Mar 2013 16:07:57 -0700
changeset 18847 40c679748fa9
parent 18846 860d36b763ae
child 18848 cc741817a49e
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)
mercurial/dicthelpers.py
--- a/mercurial/dicthelpers.py	Fri Mar 29 15:23:19 2013 -0700
+++ b/mercurial/dicthelpers.py	Fri Mar 29 16:07:57 2013 -0700
@@ -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 @@
             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)