Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slow with large inputs #240

Open
2 of 4 tasks
danielshahaf opened this issue Nov 25, 2015 · 0 comments
Open
2 of 4 tasks

Slow with large inputs #240

danielshahaf opened this issue Nov 25, 2015 · 0 comments

Comments

@danielshahaf
Copy link
Member

danielshahaf commented Nov 25, 2015

Highlighting of long, multiline buffers is slow.

Example: fned compdef (and type <SPACE> to trigger highlighting after the buffer loads).

zprof:

num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1        3667.13  3667.13   97.24%   1738.93  1738.93   46.11%  zed
 2)    6        1949.29   324.88   51.69%   1179.83   196.64   31.29%  _zsh_highlight_main_highlighter
 3)  730         525.18     0.72   13.93%    525.18     0.72   13.93%  _zsh_highlight_main_add_region_highlight
 4)  210         167.10     0.80    4.43%    157.38     0.75    4.17%  _zsh_highlight_main_highlighter_check_path

Breaking out the last line of _zsh_highlight_main_add_region_highlight` to its own anonymous function gives:

num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1        4527.99  4527.99   94.19%   2615.75  2615.75   54.41%  zed
 2)   18        2010.15   111.67   41.82%   1200.16    66.68   24.97%  _zsh_highlight_main_highlighter
 3) 1088         542.19     0.50   11.28%    542.19     0.50   11.28%  (anon)
 4)  220         172.81     0.79    3.59%    161.77     0.74    3.37%  _zsh_highlight_main_highlighter_check_path
 5)    2          56.66    28.33    1.18%     56.66    28.33    1.18%  VCS_INFO_quilt
 6)  749         554.89     0.74   11.54%     53.08     0.07    1.10%  _zsh_highlight_main_add_region_highlight

And indeed:

% zsh -fc 'local -a a; time ( repeat 5000 { a+=(foo) } )' 
( repeat 5000; do; a+=(foo) ; done; )  1.26s user 0.00s system 99% cpu 1.268 total
% zsh -fc 'local -a a; time ( repeat 10000 { a+=(foo) } )' 
( repeat 10000; do; a+=(foo) ; done; )  5.02s user 0.00s system 99% cpu 5.028 total
% zsh -fc 'local -a a; time ( repeat 20000 { a+=(foo) } )' 
( repeat 20000; do; a+=(foo) ; done; )  19.94s user 0.08s system 99% cpu 20.036 total

So:

  • Around a quarter of syntax highlighting runtime is due to array appends.
  • Array appends are O(n²) (using zsh 5.1.1-test-1, i.e., a 5.1.2 prerelease).
  • 75% of the runtime is in _zsh_highlight_main_highlighter itself.

Action items:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant