Re: [PATCH 6/8] generate-cmdlist.sh: replace for loop by printf's auto-repeat feature
From: Jeff King <hidden>
Date: 2021-10-21 14:42:57
Subsystem:
the rest · Maintainer:
Linus Torvalds
On Wed, Oct 20, 2021 at 08:39:57PM +0200, Ævar Arnfjörð Bjarmason wrote:
quoted hunk ↗ jump to hunk
From: Johannes Sixt <redacted> This is just a small code reduction. There is a small probability that the new code breaks when the category list is empty. But that would be noticed during the compile step. Signed-off-by: Johannes Sixt <redacted> Signed-off-by: Ævar Arnfjörð Bjarmason <redacted> --- generate-cmdlist.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh index e517c33710a..a1ab2b1f077 100755 --- a/generate-cmdlist.sh +++ b/generate-cmdlist.sh@@ -67,10 +67,7 @@ print_command_list () { while read cmd rest do printf " { \"$cmd\", $(get_synopsis $cmd), 0" - for cat in $(echo "$rest" | get_category_line) - do - printf " | CAT_$cat" - done + printf " | CAT_%s" $(echo "$rest" | get_category_line) echo " },"
I think this is fine, but regardless of what happens in patch 7, it's
probably worth dropping this get_category_line call. All it does is sort
and de-dup the tokens in $rest, but we don't care because we're just
OR-ing them together. And of the 3 processes spawned by each loop, it is
responsible for 2 of them.
Even if this loop is broken out into individual bits of Makefile
snippet, avoiding the extra processes is worth doing.
The patch below gives me:
$ git show HEAD:generate-cmdlist.sh >generate-cmdlist.sh.old
$ hyperfine --warmup 1 -L s ,.old -p 'make clean' 'sh generate-cmdlist.sh{s} command-list.txt'
Benchmark #1: sh generate-cmdlist.sh command-list.txt
Time (mean ± σ): 591.3 ms ± 31.5 ms [User: 392.9 ms, System: 243.7 ms]
Range (min … max): 543.7 ms … 630.6 ms 10 runs
Benchmark #2: sh generate-cmdlist.sh.old command-list.txt
Time (mean ± σ): 1.236 s ± 0.060 s [User: 1.100 s, System: 0.556 s]
Range (min … max): 1.089 s … 1.275 s 10 runs
Summary
'sh generate-cmdlist.sh command-list.txt' ran
2.09 ± 0.15 times faster than 'sh generate-cmdlist.sh.old command-list.txt'
---diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
index a1ab2b1f07..fab9e6a671 100755
--- a/generate-cmdlist.sh
+++ b/generate-cmdlist.sh@@ -67,7 +67,7 @@ print_command_list () { while read cmd rest do printf " { \"$cmd\", $(get_synopsis $cmd), 0" - printf " | CAT_%s" $(echo "$rest" | get_category_line) + printf " | CAT_%s" $rest echo " }," done echo "};"
I think you could also delete get_category_line, as it was inlined in the other caller. -Peff