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

[PATCHv3 16/16] bash prompt: mention that PROMPT_COMMAND mode is faster

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Jun 24, 2013, 16:39 UTC
Message-ID
<1372091966-19315-17-git-send-email-szeder@ira.uka.de>
In-Reply-To
<1372091966-19315-1-git-send-email-szeder@ira.uka.de>

__git_ps1() is usually added to the prompt inside a command substitution, imposing the overhead of fork()ing a subshell. Using __git_ps1() for $PROMPT_COMMAND is slightly faster, because it avoids that command substitution.

Mention this in the comments about setting up the git prompt.

The whole series speeds up the bash prompt on Windows/MSysGit considerably. Here are some timing results in three scenarios, each 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.687s
    user    0m0.075s
    sys     0m0.396s
  After, from $PROMPT_COMMAND:
    $ time for i in {0..9} ; do __git_ps1 '\h:\w' '$ ' ; done
    real    0m0.546s
    user    0m0.075s
    sys     0m0.181s
At the top of the work tree, detached head, before:
    real    0m2.574s
    user    0m0.376s
    sys     0m1.207s
  After:
    real    0m1.139s
    user    0m0.151s
    sys     0m0.500s
  After, from $PROMPT_COMMAND:
    real    0m1.030s
    user    0m0.245s
    sys     0m0.336s

In a subdirectory, during rebase, stash status indicator enabled, before:

    real    0m3.557s
    user    0m0.495s
    sys     0m1.767s
  After:
    real    0m0.717s
    user    0m0.120s
    sys     0m0.300s
  After, from $PROMPT_COMMAND:
    real    0m0.577s
    user    0m0.047s
    sys     0m0.258s

On Linux the speedup ratio is comparable to Windows, but overall it was about an order of magnitude faster to begin with. The last case from above, repeated 100 times, before:

    $ time for i in {0..99} ; do prompt="$(__git_ps1)" ; done
    real    0m2.806s
    user    0m0.180s
    sys     0m0.264s
  After:
    real    0m0.857s
    user    0m0.020s
    sys     0m0.028s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
---
 contrib/completion/git-prompt.sh | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 7152ae49..daed6a1d 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -15,11 +15,11 @@
 #        Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
 #        ZSH:  PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
 #        the optional argument will be used as format string.
-#    3b) Alternatively, if you are using bash, __git_ps1 can be
-#        used for PROMPT_COMMAND with two parameters, <pre> and
-#        <post>, which are strings you would put in $PS1 before
-#        and after the status string generated by the git-prompt
-#        machinery.  e.g.
+#    3b) Alternatively, for a slighly faster prompt, if you are
+#        using bash, __git_ps1 can be used for PROMPT_COMMAND
+#        with two parameters, <pre> and <post>, which are strings
+#        you would put in $PS1 before and after the status string
+#        generated by the git-prompt machinery.  e.g.
 #        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
 #        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
 #        will show username, at-sign, host, colon, cwd, then
-- 
1.8.3.1.599.g4459181
Previous: SZEDER GáborNext: Junio C Hamano
Message 17 of 19 in “[PATCHv3 00/16] bash prompt speedup”
  1. SZEDER GáborJun 24, 2013
  2. 01/16 bash prompt: fix redirection coding style in testsSZEDER Gábor, Jun 24, 2013
  3. 02/16 bash prompt: use 'write_script' helper in interactive rebase testSZEDER Gábor, Jun 24, 2013
  4. 03/16 completion, bash prompt: move __gitdir() tests to completion test suiteSZEDER Gábor, Jun 24, 2013
  5. 04/16 bash prompt: add a test for symbolic link symbolic refsSZEDER Gábor, Jun 24, 2013
  6. 05/16 bash prompt: print unique detached HEAD abbreviated object nameSZEDER Gábor, Jun 24, 2013
  7. 06/16 bash prompt: return early from __git_ps1() when not in a git repositorySZEDER Gábor, Jun 24, 2013
  8. 07/16 bash prompt: run 'git rev-parse --git-dir' directly instead of __gitdir()SZEDER Gábor, Jun 24, 2013
  9. 08/16 bash prompt: use bash builtins to find out rebase stateSZEDER Gábor, Jun 24, 2013
  10. 09/16 bash prompt: use bash builtins to find out current branchSZEDER Gábor, Jun 24, 2013
  11. 10/16 bash prompt: combine 'git rev-parse' executions in the main code pathSZEDER Gábor, Jun 24, 2013
  12. 11/16 bash prompt: combine 'git rev-parse' for detached headSZEDER Gábor, Jun 24, 2013
  13. 12/16 bash prompt: use bash builtins to check for unborn branch for dirty stateSZEDER Gábor, Jun 24, 2013
  14. 13/16 bash prompt: use bash builtins to check stash stateSZEDER Gábor, Jun 24, 2013
  15. 14/16 bash prompt: avoid command substitution when checking for untracked filesSZEDER Gábor, Jun 24, 2013
  16. 15/16 bash prompt: avoid command substitution when finalizing gitstringSZEDER Gábor, Jun 24, 2013
  17. 16/16 bash prompt: mention that PROMPT_COMMAND mode is fasterSZEDER Gábor, Jun 24, 2013
  18. Junio C HamanoJun 24, 2013
  19. Eduardo R. D'AvilaJun 25, 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.