Subject: bug#73766: 30.0.91; (documentation 'pcase) can take several seconds

From: Stefan Monnier <[email-masked]>
Date: Thu, 17 Oct 2024 13:22:00 -0400

>> >> Apparently, it would iterate over all defined pcase macros (N), and for
>> >> each of those, `help-fns-short-filename` would iterate over all items in
>> >> `load-path` (M). Total time complexity is N*M.
>> > Adding Stefan and João, in case they have some comments or
>> > suggestions.
>> How 'bout a patch like the one below?
> I tried this patch and can confirm it improves the performance.
> Here's the result of (benchmark-run (documentation 'pcase)):
> - master: 4s
> - master with this patch: 0.12s

Thanks 🙂

Wli, this is a non-trivial chunk of code and it's used more often than
just to get the docstring of `pcase`, so I'm clearly not obviously safe
for `emacs-30`.

Here are some options I can think of:

- Install it `emacs-30` anyway.
- Revert on `emacs-30` the change that introduced the slowdown:

    commit 052c2ce0284c5193c9d6768a45a9b3508af51230
    Author: Stefan Monnier <[email-masked]>
    Date:   Sun Feb 11 17:43:37 2024 -0500

        (pcase): Add buttons to the macros' defs in the docstring of `pcase`

        * lisp/emacs-lisp/pcase.el (pcase--find-macro-def-regexp): New var.
        (find-function-regexp-alist): Add entry for `pcase-macro`s.
        (help-fns--signature): Move declaration to where we know it is valid.
        (pcase--make-docstring): Add buttons to jump to the definition
        of Pcase macros.

- Install on `emacs-30` a simpler and more focused change, which should
  work acceptably in most cases, such as:

    diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
    index 5a7f3995311..811d42793cd 100644
    --- a/lisp/emacs-lisp/pcase.el
    +++ b/lisp/emacs-lisp/pcase.el
    @@ -214,7 +214,7 @@ pcase--make-docstring
                   (save-excursion
                     (forward-char -1)
                     (insert (format-message "  in `"))
    -                (help-insert-xref-button (help-fns-short-filename filename)
    +                (help-insert-xref-button (file-name-nondirectory filename)
                                              'help-function-def symbol filename
                                              'pcase-macro)
                     (insert (format-message "'."))))

> However it's still slower than last stable version:
> - 29.4 version: 0.02s

Slower than 29.4 is expected because it gives more information (the
file name, as a hyperlink).
I think for `C-h o` this plenty fast.

There's still a remaining performance issue for things like
`eldoc-mode`, admittedly where we'd really want it to be instantaneous,
but I think this should be fixed by making `eldoc` call `documentation`
in a special way to skips those useless computations (eldoc just wants
a "short doc" anyway).  This affects other functions using the
`function-documentation` property in a similar way.

        Stefan