mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
Replace the "grep" we run to exclude certain programs from the
generated output with a pure-shell loop that strips out the comments,
and sees if the "cmd" we're reading is on a list of excluded
programs. This uses a trick similar to test_have_prereq() in
test-lib-functions.sh.
On my *nix system this makes things quite a bit slower compared to
HEAD~:
o
'sh generate-cmdlist.sh.old command-list.txt' ran
1.56 ± 0.11 times faster than 'sh generate-cmdlist.sh command-list.txt'
18.00 ± 0.19 times faster than 'sh generate-cmdlist.sh.master command-list.txt'
But when I tried running generate-cmdlist.sh 100 times in CI I found
that it helped across the board even on OSX & Linux. I tried testing
it in CI with this ad-hoc few-liner:
for i in $(seq -w 0 11 | sort -nr)
do
git show HEAD~$i:generate-cmdlist.sh >generate-cmdlist-HEAD$i.sh &&
git add generate-cmdlist* &&
cp t/t0000-generate-cmdlist.sh t/t00$i-generate-cmdlist.sh || : &&
perl -pi -e "s/HEAD0/HEAD$i/g" t/t00$i-generate-cmdlist.sh &&
git add t/t00*.sh
done && git commit -m"generated it"
Here HEAD~02 and the t0002* file refers to this change, and HEAD~03
and t0003* file to the preceding commit, the relevant results were:
linux-gcc:
[12:05:33] t0002-generate-cmdlist.sh .. ok 14 ms ( 0.00 usr 0.00 sys + 3.64 cusr 3.09 csys = 6.73 CPU)
[12:05:30] t0003-generate-cmdlist.sh .. ok 32 ms ( 0.00 usr 0.00 sys + 2.66 cusr 1.81 csys = 4.47 CPU)
osx-gcc:
[11:58:04] t0002-generate-cmdlist.sh .. ok 80081 ms ( 0.02 usr 0.02 sys + 17.80 cusr 10.07 csys = 27.91 CPU)
[11:58:16] t0003-generate-cmdlist.sh .. ok 92127 ms ( 0.02 usr 0.01 sys + 22.54 cusr 14.27 csys = 36.84 CPU)
vs-test:
[12:03:14] t0002-generate-cmdlist.sh .. ok 30 s ( 0.02 usr 0.00 sys + 13.14 cusr 26.19 csys = 39.35 CPU)
[12:03:20] t0003-generate-cmdlist.sh .. ok 32 s ( 0.00 usr 0.02 sys + 13.25 cusr 26.10 csys = 39.37 CPU)
I.e. even on *nix running 100 of these in a loop was up to ~2x faster
in absolute runtime, I suspect it's due factors that are exacerbated
in the CI, e.g. much slower process startup due to some platform
limits, or a slower FS.
The "cut -d" change here is because we're not emitting the
40-character aligned output anymore, i.e. we'll get the output from
command_list() now, not an as-is line from command-list.txt.
This also makes the parsing more reliable, as we could tweak the
whitespace alignment without breaking this parser. Let's reword a
now-inaccurate comment in "command-list.txt" describing that previous
alignment limitation. We'll still need the "### command-list [...]"
line due to the "Documentation/cmd-list.perl" logic added in
11c6659d85
(command-list: prepare machinery for upcoming "common
groups" section, 2015-05-21).
There was a proposed change subsequent to this one[3] which continued
moving more logic into the "command_list() function, i.e. replaced the
"cut | tr | grep" chain in "category_list()" with an argument to
"command_list()".
That change might have had a bit of an effect, but not as much as the
preceding commit, so I decided to drop it. The relevant performance
numbers from it were:
linux-gcc:
[12:05:33] t0001-generate-cmdlist.sh .. ok 13 ms ( 0.00 usr 0.00 sys + 3.33 cusr 2.78 csys = 6.11 CPU)
[12:05:33] t0002-generate-cmdlist.sh .. ok 14 ms ( 0.00 usr 0.00 sys + 3.64 cusr 3.09 csys = 6.73 CPU)
osx-gcc:
[11:58:03] t0001-generate-cmdlist.sh .. ok 78416 ms ( 0.02 usr 0.01 sys + 11.78 cusr 6.22 csys = 18.03 CPU)
[11:58:04] t0002-generate-cmdlist.sh .. ok 80081 ms ( 0.02 usr 0.02 sys + 17.80 cusr 10.07 csys = 27.91 CPU)
vs-test:
[12:03:20] t0001-generate-cmdlist.sh .. ok 34 s ( 0.00 usr 0.03 sys + 12.42 cusr 19.55 csys = 32.00 CPU)
[12:03:14] t0002-generate-cmdlist.sh .. ok 30 s ( 0.02 usr 0.00 sys + 13.14 cusr 26.19 csys = 39.35 CPU)
As above HEAD~2 and t0002* are testing the code in this commit (and
the line is the same), but HEAD~1 and t0001* are testing that dropped
change in [3].
1. https://lore.kernel.org/git/cover-v2-00.10-00000000000-20211022T193027Z-avarab@gmail.com/
2. https://lore.kernel.org/git/patch-v2-08.10-83318d6c0da-20211022T193027Z-avarab@gmail.com/
3. https://lore.kernel.org/git/patch-v2-10.10-e10a43756d1-20211022T193027Z-avarab@gmail.com/
Signed-off-by: Junio C Hamano <gitster@pobox.com>
217 lines
12 KiB
Plaintext
217 lines
12 KiB
Plaintext
# Command classification list
|
|
# ---------------------------
|
|
# All supported commands, builtin or external, must be described in
|
|
# here. This info is used to list commands in various places. Each
|
|
# command is on one line followed by one or more attributes.
|
|
#
|
|
# The first attribute group is mandatory and indicates the command
|
|
# type. This group includes:
|
|
#
|
|
# mainporcelain
|
|
# ancillarymanipulators
|
|
# ancillaryinterrogators
|
|
# foreignscminterface
|
|
# plumbingmanipulators
|
|
# plumbinginterrogators
|
|
# synchingrepositories
|
|
# synchelpers
|
|
# purehelpers
|
|
#
|
|
# The type names are self explanatory. But if you want to see what
|
|
# command belongs to what group to get a better picture, have a look
|
|
# at "git" man page, "GIT COMMANDS" section.
|
|
#
|
|
# Commands of type mainporcelain can also optionally have one of these
|
|
# attributes:
|
|
#
|
|
# init
|
|
# worktree
|
|
# info
|
|
# history
|
|
# remote
|
|
#
|
|
# These commands are considered "common" and will show up in "git
|
|
# help" output in groups. Uncommon porcelain commands must not
|
|
# specify any of these attributes.
|
|
#
|
|
# "complete" attribute is used to mark that the command should be
|
|
# completable by git-completion.bash. Note that by default,
|
|
# mainporcelain commands are completable so you don't need this
|
|
# attribute.
|
|
#
|
|
# As part of the Git man page list, the man(5/7) guides are also
|
|
# specified here, which can only have "guide" attribute and nothing
|
|
# else.
|
|
#
|
|
### command list (do not change this line)
|
|
# command name category [category] [category]
|
|
git-add mainporcelain worktree
|
|
git-am mainporcelain
|
|
git-annotate ancillaryinterrogators
|
|
git-apply plumbingmanipulators complete
|
|
git-archimport foreignscminterface
|
|
git-archive mainporcelain
|
|
git-bisect mainporcelain info
|
|
git-blame ancillaryinterrogators complete
|
|
git-branch mainporcelain history
|
|
git-bugreport ancillaryinterrogators
|
|
git-bundle mainporcelain
|
|
git-cat-file plumbinginterrogators
|
|
git-check-attr purehelpers
|
|
git-check-ignore purehelpers
|
|
git-check-mailmap purehelpers
|
|
git-check-ref-format purehelpers
|
|
git-checkout mainporcelain
|
|
git-checkout-index plumbingmanipulators
|
|
git-cherry plumbinginterrogators complete
|
|
git-cherry-pick mainporcelain
|
|
git-citool mainporcelain
|
|
git-clean mainporcelain
|
|
git-clone mainporcelain init
|
|
git-column purehelpers
|
|
git-commit mainporcelain history
|
|
git-commit-graph plumbingmanipulators
|
|
git-commit-tree plumbingmanipulators
|
|
git-config ancillarymanipulators complete
|
|
git-count-objects ancillaryinterrogators
|
|
git-credential purehelpers
|
|
git-credential-cache purehelpers
|
|
git-credential-store purehelpers
|
|
git-cvsexportcommit foreignscminterface
|
|
git-cvsimport foreignscminterface
|
|
git-cvsserver foreignscminterface
|
|
git-daemon synchingrepositories
|
|
git-describe mainporcelain
|
|
git-diff mainporcelain info
|
|
git-diff-files plumbinginterrogators
|
|
git-diff-index plumbinginterrogators
|
|
git-diff-tree plumbinginterrogators
|
|
git-difftool ancillaryinterrogators complete
|
|
git-fast-export ancillarymanipulators
|
|
git-fast-import ancillarymanipulators
|
|
git-fetch mainporcelain remote
|
|
git-fetch-pack synchingrepositories
|
|
git-filter-branch ancillarymanipulators
|
|
git-fmt-merge-msg purehelpers
|
|
git-for-each-ref plumbinginterrogators
|
|
git-for-each-repo plumbinginterrogators
|
|
git-format-patch mainporcelain
|
|
git-fsck ancillaryinterrogators complete
|
|
git-gc mainporcelain
|
|
git-get-tar-commit-id plumbinginterrogators
|
|
git-grep mainporcelain info
|
|
git-gui mainporcelain
|
|
git-hash-object plumbingmanipulators
|
|
git-help ancillaryinterrogators complete
|
|
git-http-backend synchingrepositories
|
|
git-http-fetch synchelpers
|
|
git-http-push synchelpers
|
|
git-imap-send foreignscminterface
|
|
git-index-pack plumbingmanipulators
|
|
git-init mainporcelain init
|
|
git-instaweb ancillaryinterrogators complete
|
|
git-interpret-trailers purehelpers
|
|
git-log mainporcelain info
|
|
git-ls-files plumbinginterrogators
|
|
git-ls-remote plumbinginterrogators
|
|
git-ls-tree plumbinginterrogators
|
|
git-mailinfo purehelpers
|
|
git-mailsplit purehelpers
|
|
git-maintenance mainporcelain
|
|
git-merge mainporcelain history
|
|
git-merge-base plumbinginterrogators
|
|
git-merge-file plumbingmanipulators
|
|
git-merge-index plumbingmanipulators
|
|
git-merge-one-file purehelpers
|
|
git-merge-tree ancillaryinterrogators
|
|
git-mergetool ancillarymanipulators complete
|
|
git-mktag plumbingmanipulators
|
|
git-mktree plumbingmanipulators
|
|
git-multi-pack-index plumbingmanipulators
|
|
git-mv mainporcelain worktree
|
|
git-name-rev plumbinginterrogators
|
|
git-notes mainporcelain
|
|
git-p4 foreignscminterface
|
|
git-pack-objects plumbingmanipulators
|
|
git-pack-redundant plumbinginterrogators
|
|
git-pack-refs ancillarymanipulators
|
|
git-patch-id purehelpers
|
|
git-prune ancillarymanipulators complete
|
|
git-prune-packed plumbingmanipulators
|
|
git-pull mainporcelain remote
|
|
git-push mainporcelain remote
|
|
git-quiltimport foreignscminterface
|
|
git-range-diff mainporcelain
|
|
git-read-tree plumbingmanipulators
|
|
git-rebase mainporcelain history
|
|
git-receive-pack synchelpers
|
|
git-reflog ancillarymanipulators complete
|
|
git-remote ancillarymanipulators complete
|
|
git-repack ancillarymanipulators complete
|
|
git-replace ancillarymanipulators complete
|
|
git-request-pull foreignscminterface complete
|
|
git-rerere ancillaryinterrogators
|
|
git-reset mainporcelain history
|
|
git-restore mainporcelain worktree
|
|
git-rev-list plumbinginterrogators
|
|
git-rev-parse plumbinginterrogators
|
|
git-revert mainporcelain
|
|
git-rm mainporcelain worktree
|
|
git-send-email foreignscminterface complete
|
|
git-send-pack synchingrepositories
|
|
git-sh-i18n purehelpers
|
|
git-sh-setup purehelpers
|
|
git-shell synchelpers
|
|
git-shortlog mainporcelain
|
|
git-show mainporcelain info
|
|
git-show-branch ancillaryinterrogators complete
|
|
git-show-index plumbinginterrogators
|
|
git-show-ref plumbinginterrogators
|
|
git-sparse-checkout mainporcelain
|
|
git-stage complete
|
|
git-stash mainporcelain
|
|
git-status mainporcelain info
|
|
git-stripspace purehelpers
|
|
git-submodule mainporcelain
|
|
git-svn foreignscminterface
|
|
git-switch mainporcelain history
|
|
git-symbolic-ref plumbingmanipulators
|
|
git-tag mainporcelain history
|
|
git-unpack-file plumbinginterrogators
|
|
git-unpack-objects plumbingmanipulators
|
|
git-update-index plumbingmanipulators
|
|
git-update-ref plumbingmanipulators
|
|
git-update-server-info synchingrepositories
|
|
git-upload-archive synchelpers
|
|
git-upload-pack synchelpers
|
|
git-var plumbinginterrogators
|
|
git-verify-commit ancillaryinterrogators
|
|
git-verify-pack plumbinginterrogators
|
|
git-verify-tag ancillaryinterrogators
|
|
git-whatchanged ancillaryinterrogators complete
|
|
git-worktree mainporcelain
|
|
git-write-tree plumbingmanipulators
|
|
gitattributes guide
|
|
gitcli guide
|
|
gitcore-tutorial guide
|
|
gitcredentials guide
|
|
gitcvs-migration guide
|
|
gitdiffcore guide
|
|
giteveryday guide
|
|
gitfaq guide
|
|
gitglossary guide
|
|
githooks guide
|
|
gitignore guide
|
|
gitk mainporcelain
|
|
gitmailmap guide
|
|
gitmodules guide
|
|
gitnamespaces guide
|
|
gitremote-helpers guide
|
|
gitrepository-layout guide
|
|
gitrevisions guide
|
|
gitsubmodules guide
|
|
gittutorial guide
|
|
gittutorial-2 guide
|
|
gitweb ancillaryinterrogators
|
|
gitworkflows guide
|