'main': Further optimize argument parsing.
% repeat 3 { zsh -f tests/test-zprof.zsh main | tee … | grep -w _zsh_highlight | head -n1 } 18) 1 26895.86 26895.86 100.00% 6.35 6.35 0.02% _zsh_highlight 19) 1 27399.11 27399.11 100.00% 5.52 5.52 0.02% _zsh_highlight 19) 1 27027.58 27027.58 100.00% 5.66 5.66 0.02% _zsh_highlight ---- This commit has been rebased. The above statistics were measured after the rebase. The below statistics had been measured before the rebase. num calls time self name ----------------------------------------------------------------------------------- 1) 3 25689.17 8563.06 98.15% 18422.01 6140.67 70.38% _zsh_highlight_main_highlighter_highlight_list 2) 32390 5706.13 0.18 21.80% 2315.68 0.07 8.85% _zsh_highlight_main_highlighter_highlight_argument 19) 1 26173.33 26173.33 100.00% 5.27 5.27 0.02% _zsh_highlight Interestingly, if I make the change in this diff to _zsh_highlight_main_highlighter_highlight_double_quote — > diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh > index da6ab2b..bb17618 100644 > --- a/highlighters/main/main-highlighter.zsh > +++ b/highlighters/main/main-highlighter.zsh > @@ -1462,10 +1462,13 @@ _zsh_highlight_main_highlighter_highlight_double_quote() > local i j k ret style > reply=() > > - for (( i = $1 + 1 ; i <= $#arg ; i += 1 )) ; do > + (( i = $1 )) > + while (( ++i <= $#arg )); do > + i=${arg[(ib.i.)[\"\`\$\\\\${histchars[1]}]]} > (( j = i + start_pos - 1 )) > (( k = j + 1 )) > case "$arg[$i]" in > + ("") break;; > ('"') break;; > ('`') saved_reply=($reply) > _zsh_highlight_main_highlighter_highlight_backtick $i — it actually makes things measurably slower (!), even on input that has a large number of pasted double-quoted strings: on «BUFFER=": ${(r.8*1500..foo"bar".):-}"» the slowdown is (1123.24ms / 1091.06ms = 1.0295). Therefore, I won't be committing that change.
This commit is contained in:
parent
700c0e18fe
commit
8f5d74d219
@ -1312,12 +1312,11 @@ _zsh_highlight_main_highlighter_highlight_argument()
|
||||
esac
|
||||
|
||||
# This loop is a hot path. Keep it fast!
|
||||
for (( ; i <= $#arg ; i += 1 )); do
|
||||
if [[ $arg[$i] != [\\\'\"\`\$\<\>\*\?] ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
(( --i ))
|
||||
while (( ++i <= $#arg )); do
|
||||
i=${arg[(ib.i.)[\\\'\"\`\$\<\>\*\?]]}
|
||||
case "$arg[$i]" in
|
||||
"") break;;
|
||||
"\\") (( i += 1 )); continue;;
|
||||
"'")
|
||||
_zsh_highlight_main_highlighter_highlight_single_quote $i
|
||||
|
Loading…
Reference in New Issue
Block a user