[PATCH 3 of 5 RFC] dirstate: make dirstate._join a bit faster on posix

Kostia Balytskyi ikostia at fb.com
Sat Aug 12 04:22:58 EDT 2017


# HG changeset patch
# User Kostia Balytskyi <ikostia at fb.com>
# Date 1502522493 25200
#      Sat Aug 12 00:21:33 2017 -0700
# Node ID bac7b1ae4a0c998c57cea5eac51af66853779918
# Parent  a1c8f310a66ada40697c824f4621bb54c757e9fa
dirstate: make dirstate._join a bit faster on posix

This is a micro-optimization, suggested by @quark for one of the previous
patches. It is safe to land the series without this micro-optimization.

diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -99,6 +99,9 @@ class dirstate(object):
         # for consistent view between _pl() and _read() invocations
         self._pendingmode = None
 
+        if pycompat.osname != 'nt':
+            self._join = self._join_posix
+
     @contextlib.contextmanager
     def parentchange(self):
         '''Context manager for handling dirstate parents.
@@ -271,6 +274,13 @@ class dirstate(object):
     def _join(self, f):
         return util.absjoin(self._rootdir, f)
 
+    def _join_posix(self, f):
+        # The cross-platform _join() has windows-specific logic that
+        # is much more branchy. Since this is called O(files in working copy)
+        # times regularly, we microoptimize here.
+        # This is safe because f is always a relative path.
+        return self._rootdir + f
+
     def flagfunc(self, buildfallback):
         if self._checklink and self._checkexec:
             def f(x):


More information about the Mercurial-devel mailing list