[PATCH] dirstate._walkexplicit: don't bother normalizing ''

Siddharth Agarwal sid at less-broken.com
Mon Mar 30 01:25:22 CDT 2015


On 03/29/2015 09:31 PM, Martin von Zweigbergk wrote:
>
>
> On Sun, Mar 29, 2015 at 8:41 PM Siddharth Agarwal <sid0 at fb.com
> <mailto:sid0 at fb.com>> wrote:
>
>     # HG changeset patch
>     # User Siddharth Agarwal <sid0 at fb.com <mailto:sid0 at fb.com>>
>     # Date 1427678928 25200
>     #      Sun Mar 29 18:28:48 2015 -0700
>     # Node ID da9074bcbd34008b2615f019fd57d203b80425e1
>     # Parent  efa094701a05d58d505c3b0c3b3c73dba4e51e97
>     dirstate._walkexplicit: don't bother normalizing ''
>
>     The overwhelmingly common case is running commands like 'hg diff'
>     with no
>     arguments. Therefore the only file that'll be listed is the root
>     directory.
>     Normalizing that's just a waste of time.
>
>     This means that for a plain 'hg diff' we'll never need to
>     construct the
>     foldmap, saving us a significant chunk of time.
>
>     On case-insensitive HFS+ on OS X, for a large repository with over
>     200,000
>     files, this brings down 'hg diff' from 2.97 seconds to 2.36.
>
>     diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
>     --- a/mercurial/dirstate.py
>     +++ b/mercurial/dirstate.py
>     @@ -635,10 +635,15 @@
>
>              alldirs = None
>              for ff in files:
>     -            if normalize:
>     -                nf = normalize(normpath(ff), False, True)
>     +            # constructing the foldmap is expensive, so don't do
>     it for the
>     +            # common case where files is ['']
>     +            if ff != '':
>     +                if normalize:
>     +                    nf = normalize(normpath(ff), False, True)
>     +                else:
>     +                    nf = normpath(ff)
>                  else:
>     -                nf = normpath(ff)
>     +                nf = '.'
>
>
> Nit: It might be simpler to call normpath() first:
>
> nf = normpath(ff)
> if nf != '.' and normalize:
>   nf = normalize(nf, False, True)
>
> Slightly off topic: When does normpath have any effect anyway? The
> paths get here through a matcher and the matcher seems to normalize
> all paths. The only effect normpath seems to have is to convert '' to
> '.' (i.e. back to what it was before we converted from '.' to '' a few
> lines up).

I suspect you're completely correct. Let me double check then send out
patches cleaning this up.

- Siddharth


More information about the Mercurial-devel mailing list