git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 10/13] bash prompt: combine 'git rev-parse' executions

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Jun 18, 2013, 09:49 UTC
Message-ID
<20130618094931.GB2204@goldbirke>
In-Reply-To
<20130618060535.GE5916@sigill.intra.peff.net>
On Tue, Jun 18, 2013 at 02:05:35AM -0400, Jeff King wrote:
Show 35 quoted lines
> 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...)

Show 11 quoted lines
> 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
Previous: Jeff KingNext: SZEDER Gábor
Message 15 of 22 in “bash prompt speedup”
  1. 00/13 bash prompt speedupSZEDER Gábor, Jun 18, 2013
  2. 01/13 bash prompt: fix redirection coding style in testsSZEDER Gábor, Jun 18, 2013
  3. 02/13 bash prompt: fix here document indentation in interactive rebase testSZEDER Gábor, Jun 18, 2013
  4. Jeff KingJun 18, 2013
  5. 03/13 completion, bash prompt: move __gitdir() tests to completion test suiteSZEDER Gábor, Jun 18, 2013
  6. 04/13 bash prompt: add a test for symbolic link symbolic refsSZEDER Gábor, Jun 18, 2013
  7. 05/13 bash prompt: return early from __git_ps1() when not in a git repositorySZEDER Gábor, Jun 18, 2013
  8. 06/13 bash prompt: run 'git rev-parse --git-dir' directly instead of __gitdir()SZEDER Gábor, Jun 18, 2013
  9. Eric SunshineJun 18, 2013
  10. 07/13 bash prompt: use bash builtins to find out rebase stateSZEDER Gábor, Jun 18, 2013
  11. 08/13 bash prompt: use bash builtins to find out current branchSZEDER Gábor, Jun 18, 2013
  12. 09/13 bash prompt: use bash builtins to get detached HEAD abbrev. object nameSZEDER Gábor, Jun 18, 2013
  13. 10/13 bash prompt: combine 'git rev-parse' executionsSZEDER Gábor, Jun 18, 2013
  14. Jeff KingJun 18, 2013
  15. SZEDER GáborJun 18, 2013
  16. fixup! bash prompt: use bash builtins to find out current branchSZEDER Gábor, Jun 18, 2013
  17. 11/13 bash prompt: use bash builtins to check stash stateSZEDER Gábor, Jun 18, 2013
  18. 12/13 bash prompt: avoid command substitution when checking for untracked filesSZEDER Gábor, Jun 18, 2013
  19. 13/13 bash prompt: avoid command substitution when finalizing gitstringSZEDER Gábor, Jun 18, 2013
  20. SZEDER GáborJun 18, 2013
  21. Junio C HamanoJun 18, 2013
  22. Simon OosthoekJun 18, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.