GNU bug report logs - #73766
30.0.91; (documentation 'pcase) can take several seconds

Previous Next

Package: emacs;

Reported by: Yikai Zhao <yikai <at> z1k.dev>

Date: Sat, 12 Oct 2024 08:03:01 UTC

Severity: normal

Found in version 30.0.91

Done: Stefan Monnier <monnier <at> iro.umontreal.ca>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Yikai Zhao <yikai <at> z1k.dev>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 73766 <at> debbugs.gnu.org, João Távora <joaotavora <at> gmail.com>
Subject: bug#73766: 30.0.91; (documentation 'pcase) can take several seconds
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 <monnier <at> iro.umontreal.ca>
    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





This bug report was last modified 299 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.