Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers

From: kobarity <[email-masked]>
Date: Thu, 10 Apr 2025 00:33:03 +0900

Eli Zaretskii wrote:
> 
> > From: JD Smith <[email-masked]>
> > Date: Mon, 7 Apr 2025 17:48:49 -0400
> > 
> > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)
> > 
> > 
> > Try this test at the start of L8817 in this file (no eglot needed; either python-mode or python-ts-mode is fine, as both show the same issue):
> > 
> > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/lib/matplotlib/axes/_axes.py
> > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/lib/matplotlib/axes/_axes.py￼
> > _axes
> > Text Document · 353 KB
> > 
> > In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers.
> 
> The Lisp profile, which seems to point to the likely culprit, is
> below.
> 
> Maybe kobarity (CC'ed) will have some ideas or suggestions.
> 
>          345  89% - ...
>          343  89%  - cond
>          343  89%   - let
>          343  89%    - condition-case
>          343  89%     - progn
>          343  89%      - save-excursion
>          173  44%       - funcall
>          173  44%        - thing-at-point--end-of-sexp
>          173  44%         - let
>          173  44%          - if
>          173  44%           - condition-case
>          173  44%            - forward-sexp
>          173  44%             - python-nav-forward-sexp
>          173  44%              - python-nav--forward-sexp
>          173  44%               - python-info-statement-ends-block-p
>          173  44%                - python-nav-end-of-block
>           96  24%                 - python-nav-end-of-statement
>           69  17%                  - syntax-ppss
>           67  17%                     parse-partial-sexp
>           27   7%                  - python-info-line-ends-backslash-p
>           27   7%                   - syntax-ppss
>           27   7%                      parse-partial-sexp
>           76  19%                 - python-nav-beginning-of-block
>           76  19%                  - python-nav-backward-block
>           76  19%                   - python-nav-forward-block
>           75  19%                    - python-syntax-context-type
>           75  19%                     - syntax-ppss
>           74  19%                        parse-partial-sexp
>            1   0%                    - python-nav-beginning-of-statement
>            1   0%                       point-marker
>            1   0%                   current-indentation
>          170  44%       - let
>          170  44%        - if
>          170  44%         - funcall
>          170  44%          - thing-at-point--beginning-of-sexp
>          170  44%           - let
>          170  44%            - if
>          170  44%             - forward-sexp
>          170  44%              - python-nav-forward-sexp
>          170  44%               - python-nav--forward-sexp
>          170  44%                - python-info-statement-ends-block-p
>          170  44%                 - python-nav-end-of-block
>           95  24%                  - python-nav-end-of-statement
>           63  16%                   - syntax-ppss
>           62  16%                      parse-partial-sexp
>           31   8%                   - python-info-line-ends-backslash-p
>           31   8%                    - syntax-ppss
>           30   7%                       parse-partial-sexp
>            1   0%                     re-search-forward
>           75  19%                  - python-nav-beginning-of-block
>           75  19%                   - python-nav-backward-block
>           75  19%                    - python-nav-forward-block
>           72  18%                     - python-syntax-context-type
>           72  18%                      - syntax-ppss
>           71  18%                         parse-partial-sexp
>            2   0%                       re-search-backward
>            1   0%                     - python-nav-beginning-of-statement
>            1   0%                      - python-info-line-ends-backslash-p
>            1   0%                       - syntax-ppss
>            1   0%                          syntax-ppss--data
>            2   0%  - python-shell-get-process
>            2   0%   - python-shell-get-buffer
>            2   0%    - seq-some
>            2   0%     + seq-do
>           32   8%   Automatic GC
>            6   1% - command-execute
>            6   1%  - call-interactively
>            6   1%   - byte-code
>            6   1%    - read-extended-command
>            6   1%     - read-extended-command-1
>            6   1%      - completing-read
>            6   1%       - completing-read-default
>            6   1%        - read-from-minibuffer
>            1   0%           redisplay_internal (C function)
>            2   0%   redisplay_internal (C function)

Please give me some time as I'm trying to improve performance.