Git development
 help / color / mirror / Atom feed
From: "SZEDER Gábor" <szeder@ira.uka.de>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v2 10/13] bash prompt: combine 'git rev-parse' executions
Date: Tue, 18 Jun 2013 11:49:31 +0200	[thread overview]
Message-ID: <20130618094931.GB2204@goldbirke> (raw)
In-Reply-To: <20130618060535.GE5916@sigill.intra.peff.net>

On Tue, Jun 18, 2013 at 02:05:35AM -0400, Jeff King wrote:
> On Tue, Jun 18, 2013 at 04:17:03AM +0200, SZEDER Gábor wrote:
> 
> > The whole series speeds up the bash prompt on Windows/MSysGit
> > considerably.  Here are some timing results in two scenarios, repeated
> > 10 times:
> > 
> > At the top of the work tree, before:
> > 
> >     $ time for i in {0..9} ; do prompt="$(__git_ps1)" ; done
> > 
> >     real    0m1.716s
> >     user    0m0.301s
> >     sys     0m0.772s
> > 
> >   After:
> > 
> >     real    0m0.686s
> >     user    0m0.075s
> >     sys     0m0.287s
> > 
> > In a subdirectory, during rebase, stash status indicator enabled,
> > before:
> > 
> >     real    0m3.557s
> >     user    0m0.495s
> >     sys     0m1.767s
> > 
> >   After:
> > 
> >     real    0m0.702s
> >     user    0m0.045s
> >     sys     0m0.409s
> 
> Very nice speedup (or perhaps it is a testament to how bad fork() is on
> msys).

Well, it seems it's not just fork() & friends.  The latter case on
Linux, before:

  $ time for i in {0..99}; do prompt="$(__git_ps1)" ; done
  
    real    0m2.819s
    user    0m0.180s
    sys     0m0.272s

  After:
  
    real    0m0.787s
    user    0m0.000s
    sys     0m0.044s

If you look solely at speedup (Win/MSys: 80%, Linux: 72%), Linux isn't
that much better either, but overall it's about an order of magnitude
faster to begin with (100 repetitions vs. 10).

Btw, it could still be a bit faster in you would care to change your
prompt to run from $PROMPT_COMMAND, because it would avoid that final
$(__git_ps1) command sunstitution, too.  But I didn't measured that
because I find the interface awful ;)  (Hmm, speaking of which, the
patch reading HEAD might break setups using $PROMPT_COMMAND, because
it might do a simple return without updating $PS1...)

> Reading patches 8 and 9, I can't help but feel that "git status"
> is letting us down a little by making us parse all of this data
> ourselves. In theory, __git_ps1() could just be something like:
> 
>   eval "$(git status --shell)"
>   printf ...
> 
> and the heavy lifting could be done in a single C process which does not
> have to worry about fork overhead. But that is quite far from where we
> are now, so while it might be an interesting place to go in the future,
> I do not think such dreams would want to hold up current work.

Yeah, that would be one way to go.  It would have the added benefit
that it could support 'core.abbrev' in the non-describable detached
HEAD case without noticable overhead.

OTOH it still requires a command substitution and a git command, so
it's less than ideal.  The previous version of this series more than a
year ago did some tricky things to create a prompt without a single
fork(), let alone exec(), e.g. looking for .git directory with bash
builtins, comparing pwd's prefix with path to .git dir to find out
whether inside .git dir, etc.  As a result even that
subdir+rebase+stash case could be done in 10ms on Windows.  Too bad
that that "inside .git dir" check could misfire on case insensitive
file systems, so we have to do that check with '$(git rev-parse)'.

  http://thread.gmane.org/gmane.comp.version-control.git/197432/focus=197450


Gábor

  reply	other threads:[~2013-06-18  9:49 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-18  2:16 [PATCH v2 00/13] bash prompt speedup SZEDER Gábor
2013-06-18  2:16 ` [PATCH v2 01/13] bash prompt: fix redirection coding style in tests SZEDER Gábor
2013-06-18  2:16 ` [PATCH v2 02/13] bash prompt: fix here document indentation in interactive rebase test SZEDER Gábor
2013-06-18  5:54   ` Jeff King
2013-06-18  2:16 ` [PATCH v2 03/13] completion, bash prompt: move __gitdir() tests to completion test suite SZEDER Gábor
2013-06-18  2:16 ` [PATCH v2 04/13] bash prompt: add a test for symbolic link symbolic refs SZEDER Gábor
2013-06-18  2:16 ` [PATCH v2 05/13] bash prompt: return early from __git_ps1() when not in a git repository SZEDER Gábor
2013-06-18  2:16 ` [PATCH v2 06/13] bash prompt: run 'git rev-parse --git-dir' directly instead of __gitdir() SZEDER Gábor
2013-06-18  4:16   ` Eric Sunshine
2013-06-18  2:17 ` [PATCH v2 07/13] bash prompt: use bash builtins to find out rebase state SZEDER Gábor
2013-06-18  2:17 ` [PATCH v2 08/13] bash prompt: use bash builtins to find out current branch SZEDER Gábor
2013-06-18  2:17 ` [PATCH v2 09/13] bash prompt: use bash builtins to get detached HEAD abbrev. object name SZEDER Gábor
2013-06-18  2:17 ` [PATCH v2 10/13] bash prompt: combine 'git rev-parse' executions SZEDER Gábor
2013-06-18  6:05   ` Jeff King
2013-06-18  9:49     ` SZEDER Gábor [this message]
2013-06-18 10:01       ` [PATCH] fixup! bash prompt: use bash builtins to find out current branch SZEDER Gábor
2013-06-18  2:17 ` [PATCH v2 11/13] bash prompt: use bash builtins to check stash state SZEDER Gábor
2013-06-18  2:17 ` [PATCH v2 12/13] bash prompt: avoid command substitution when checking for untracked files SZEDER Gábor
2013-06-18  2:17 ` [PATCH v2 13/13] bash prompt: avoid command substitution when finalizing gitstring SZEDER Gábor
2013-06-18  2:28 ` [PATCH v2 00/13] bash prompt speedup SZEDER Gábor
2013-06-18 16:48 ` Junio C Hamano
2013-06-18 19:35   ` Simon Oosthoek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130618094931.GB2204@goldbirke \
    --to=szeder@ira.uka.de \
    --cc=git@vger.kernel.org \
    --cc=peff@peff.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox