GNU bug report logs - #66512
30.0.50; flymake with checkdoc slows down typing in large Elisp buffers

Previous Next

Package: emacs;

Reported by: Visuwesh <visuweshm <at> gmail.com>

Date: Fri, 13 Oct 2023 05:55:01 UTC

Severity: normal

Found in version 30.0.50

To reply to this bug, email your comments to 66512 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#66512; Package emacs. (Fri, 13 Oct 2023 05:55:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Visuwesh <visuweshm <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Fri, 13 Oct 2023 05:55:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Visuwesh <visuweshm <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 30.0.50; flymake with checkdoc slows down typing in large Elisp
 buffers
Date: Fri, 13 Oct 2023 11:23:31 +0530
[Message part 1 (text/plain, inline)]
flymake-mode is largely unusable in large Elisp buffers with checkdoc
enabled as it sometimes takes a second for the typed words to be
displayed, and there are too many micro freezes.  I have attached two
profiles one from emacs -Q, and one from my personal configuration saved
using the command profiler-report-write-profile.  Both point to
checkdoc-this-string-valid being the time consuming function.

To reproduce,

    1. src/emacs -Q
    2. C-x C-f lisp/org/org.el RET
    3. M-x flymake-mode RET
    4. M-g i org-drag-line-forward RET
    5. Move the point to be inside the docstring, and start typing away.
       You should notice the latency sooner or later.

I can reproduce this in my fairly long init.el file too (~10k lines) and
I was forced to turn off checkdoc for the typing to be bearable in my
init.el file.

[emacs-personal-config-checkdoc-slow.eld (application/octet-stream, attachment)]
[emacs-Q-checkdoc-slow.eld (application/octet-stream, attachment)]
[Message part 4 (text/plain, inline)]
This expansion is from my personal configuration:

       10564  91% - timer-event-handler
       10564  91%  - apply
       10452  90%   - #<compiled -0x15d5576a503803dd>
       10452  90%    - flymake-start
       10452  90%     - run-hook-wrapped
       10452  90%      - #<compiled -0xa066ffdeba1d889>
       10452  90%       - flymake--run-backend
       10452  90%        - apply
       10313  88%         - elisp-flymake-checkdoc
       10277  88%          - checkdoc-current-buffer
        8560  73%           - checkdoc-start
        8560  73%            - checkdoc-continue
        6288  54%             - checkdoc-this-string-valid
        3342  28%              - checkdoc-defun-info
        1759  15%               - end-of-defun
         922   7%                - #<compiled 0xb4b7b2e75ab36>
         922   7%                 - forward-sexp
         910   7%                    scan-sexps
         757   6%                - beginning-of-defun-raw
         717   6%                 - syntax-ppss
         689   5%                    parse-partial-sexp
           8   0%                    syntax-propertize
           4   0%                    #<compiled -0x42d4fdd508f1a2e>
           4   0%                    make-closure
          28   0%                   re-search-backward
          48   0%                + #<compiled -0x12ecd99cbfd8c270>
         596   5%               + syntax-ppss
         567   4%               + beginning-of-defun
         240   2%                 re-search-forward
          52   0%               + forward-sexp
          44   0%                 looking-at
          12   0%                 read
           8   0%                 make-vector
           4   0%                 flatten-tree
        2902  25%              + checkdoc-this-string-valid-engine
          28   0%                looking-at
           8   0%                make-closure
           4   0%              + forward-sexp
        2268  19%             + checkdoc-next-docstring
         996   8%           + checkdoc-rogue-spaces
         712   6%           + checkdoc-message-text
           6   0%           + checkdoc-start-section
           3   0%           + checkdoc-comments
          32   0%          + #<compiled -0xf759b3bc90215af>
           4   0%          + #<compiled 0xb86a3dc64a1e2>
         139   1%         + elisp-flymake-byte-compile
          52   0%   + #<compiled 0x1a58a16b3cf8cf00>
          40   0%   + show-paren-function
          12   0%   + jit-lock-stealth-fontify
           8   0%   + #<compiled 0x12c5f6ab3ecc1b96>
         542   4% + redisplay_internal (C function)
         369   3% + command-execute
          76   0% + eldoc-pre-command-refresh-echo-area
          24   0% + #<compiled -0xf6b215b945ed59>
           7   0% + jit-lock--antiblink-post-command
           5   0%   internal-timer-start-idle
           4   0% + tab-bar--history-pre-change
           0   0%   ...



In GNU Emacs 30.0.50 (build 13, x86_64-pc-linux-gnu, X toolkit, cairo
 version 1.16.0, Xaw scroll bars) of 2023-10-08 built on astatine
Repository revision: 940df63d2daf50b899a66cd1542bec0c0f3eaebf
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12101008
System Description: Debian GNU/Linux trixie/sid

Configured using:
 'configure --with-sound=alsa --with-x-toolkit=lucid --with-json
 --without-xaw3d --without-gconf --without-libsystemd --with-cairo
 --with-xft'
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LIBOTF LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG
SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM
XINPUT2 XPM LUCID ZLIB
Important settings:
  value of $LC_MONETARY: ta_IN.UTF-8
  value of $LC_NUMERIC: ta_IN.UTF-8
  value of $LANG: en_GB.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Profiler-Report

Minor modes in effect:
  recentf-mode: t
  server-mode: t
  eros-mode: t
  pdf-occur-global-minor-mode: t
  minibuffer-depth-indicate-mode: t
  repeat-mode: t
  display-time-mode: t
  display-battery-mode: t
  delete-selection-mode: t
  xterm-mouse-mode: t
  straight-use-package-mode: t
  straight-package-neutering-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  use-hard-newlines: t
  tab-bar-history-mode: t
  tab-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  undelete-frame-mode: t
  minibuffer-regexp-mode: t
  buffer-read-only: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/viz/lib/emacs/straight/build/transient/transient hides /home/viz/lib/ports/emacs/lisp/transient
/home/viz/lib/emacs/straight/build/org/ob-awk hides /home/viz/lib/ports/emacs/lisp/org/ob-awk
/home/viz/lib/emacs/straight/build/org/org-capture hides /home/viz/lib/ports/emacs/lisp/org/org-capture
/home/viz/lib/emacs/straight/build/org/ob-sql hides /home/viz/lib/ports/emacs/lisp/org/ob-sql
/home/viz/lib/emacs/straight/build/org/ol-doi hides /home/viz/lib/ports/emacs/lisp/org/ol-doi
/home/viz/lib/emacs/straight/build/org/org-plot hides /home/viz/lib/ports/emacs/lisp/org/org-plot
/home/viz/lib/emacs/straight/build/org/ob-dot hides /home/viz/lib/ports/emacs/lisp/org/ob-dot
/home/viz/lib/emacs/straight/build/org/ol-eshell hides /home/viz/lib/ports/emacs/lisp/org/ol-eshell
/home/viz/lib/emacs/straight/build/org/ob-C hides /home/viz/lib/ports/emacs/lisp/org/ob-C
/home/viz/lib/emacs/straight/build/org/ob-ref hides /home/viz/lib/ports/emacs/lisp/org/ob-ref
/home/viz/lib/emacs/straight/build/org/org-list hides /home/viz/lib/ports/emacs/lisp/org/org-list
/home/viz/lib/emacs/straight/build/org/org-mouse hides /home/viz/lib/ports/emacs/lisp/org/org-mouse
/home/viz/lib/emacs/straight/build/org/ob-haskell hides /home/viz/lib/ports/emacs/lisp/org/ob-haskell
/home/viz/lib/emacs/straight/build/org/ob-plantuml hides /home/viz/lib/ports/emacs/lisp/org/ob-plantuml
/home/viz/lib/emacs/straight/build/org/org-keys hides /home/viz/lib/ports/emacs/lisp/org/org-keys
/home/viz/lib/emacs/straight/build/org/org-clock hides /home/viz/lib/ports/emacs/lisp/org/org-clock
/home/viz/lib/emacs/straight/build/org/ox-html hides /home/viz/lib/ports/emacs/lisp/org/ox-html
/home/viz/lib/emacs/straight/build/org/oc-biblatex hides /home/viz/lib/ports/emacs/lisp/org/oc-biblatex
/home/viz/lib/emacs/straight/build/org/ob-table hides /home/viz/lib/ports/emacs/lisp/org/ob-table
/home/viz/lib/emacs/straight/build/org/ob hides /home/viz/lib/ports/emacs/lisp/org/ob
/home/viz/lib/emacs/straight/build/org/ol-w3m hides /home/viz/lib/ports/emacs/lisp/org/ol-w3m
/home/viz/lib/emacs/straight/build/org/ob-groovy hides /home/viz/lib/ports/emacs/lisp/org/ob-groovy
/home/viz/lib/emacs/straight/build/org/org-footnote hides /home/viz/lib/ports/emacs/lisp/org/org-footnote
/home/viz/lib/emacs/straight/build/org/org-entities hides /home/viz/lib/ports/emacs/lisp/org/org-entities
/home/viz/lib/emacs/straight/build/org/ob-org hides /home/viz/lib/ports/emacs/lisp/org/ob-org
/home/viz/lib/emacs/straight/build/org/org-macs hides /home/viz/lib/ports/emacs/lisp/org/org-macs
/home/viz/lib/emacs/straight/build/org/ob-shell hides /home/viz/lib/ports/emacs/lisp/org/ob-shell
/home/viz/lib/emacs/straight/build/org/ob-R hides /home/viz/lib/ports/emacs/lisp/org/ob-R
/home/viz/lib/emacs/straight/build/org/ob-lisp hides /home/viz/lib/ports/emacs/lisp/org/ob-lisp
/home/viz/lib/emacs/straight/build/org/ob-js hides /home/viz/lib/ports/emacs/lisp/org/ob-js
/home/viz/lib/emacs/straight/build/org/ob-maxima hides /home/viz/lib/ports/emacs/lisp/org/ob-maxima
/home/viz/lib/emacs/straight/build/org/ox-ascii hides /home/viz/lib/ports/emacs/lisp/org/ox-ascii
/home/viz/lib/emacs/straight/build/org/org-persist hides /home/viz/lib/ports/emacs/lisp/org/org-persist
/home/viz/lib/emacs/straight/build/org/ox-md hides /home/viz/lib/ports/emacs/lisp/org/ox-md
/home/viz/lib/emacs/straight/build/org/org-duration hides /home/viz/lib/ports/emacs/lisp/org/org-duration
/home/viz/lib/emacs/straight/build/org/ob-lilypond hides /home/viz/lib/ports/emacs/lisp/org/ob-lilypond
/home/viz/lib/emacs/straight/build/org/ob-ruby hides /home/viz/lib/ports/emacs/lisp/org/ob-ruby
/home/viz/lib/emacs/straight/build/org/ob-core hides /home/viz/lib/ports/emacs/lisp/org/ob-core
/home/viz/lib/emacs/straight/build/org/ol-mhe hides /home/viz/lib/ports/emacs/lisp/org/ol-mhe
/home/viz/lib/emacs/straight/build/org/ob-ditaa hides /home/viz/lib/ports/emacs/lisp/org/ob-ditaa
/home/viz/lib/emacs/straight/build/org/ol-irc hides /home/viz/lib/ports/emacs/lisp/org/ol-irc
/home/viz/lib/emacs/straight/build/org/ob-fortran hides /home/viz/lib/ports/emacs/lisp/org/ob-fortran
/home/viz/lib/emacs/straight/build/org/org-feed hides /home/viz/lib/ports/emacs/lisp/org/org-feed
/home/viz/lib/emacs/straight/build/org/ob-java hides /home/viz/lib/ports/emacs/lisp/org/ob-java
/home/viz/lib/emacs/straight/build/org/ox hides /home/viz/lib/ports/emacs/lisp/org/ox
/home/viz/lib/emacs/straight/build/org/oc-csl hides /home/viz/lib/ports/emacs/lisp/org/oc-csl
/home/viz/lib/emacs/straight/build/org/ob-exp hides /home/viz/lib/ports/emacs/lisp/org/ob-exp
/home/viz/lib/emacs/straight/build/org/org-loaddefs hides /home/viz/lib/ports/emacs/lisp/org/org-loaddefs
/home/viz/lib/emacs/straight/build/org/ob-scheme hides /home/viz/lib/ports/emacs/lisp/org/ob-scheme
/home/viz/lib/emacs/straight/build/org/ob-tangle hides /home/viz/lib/ports/emacs/lisp/org/ob-tangle
/home/viz/lib/emacs/straight/build/org/ox-koma-letter hides /home/viz/lib/ports/emacs/lisp/org/ox-koma-letter
/home/viz/lib/emacs/straight/build/org/ob-gnuplot hides /home/viz/lib/ports/emacs/lisp/org/ob-gnuplot
/home/viz/lib/emacs/straight/build/org/org-crypt hides /home/viz/lib/ports/emacs/lisp/org/org-crypt
/home/viz/lib/emacs/straight/build/org/org-datetree hides /home/viz/lib/ports/emacs/lisp/org/org-datetree
/home/viz/lib/emacs/straight/build/org/org-attach hides /home/viz/lib/ports/emacs/lisp/org/org-attach
/home/viz/lib/emacs/straight/build/org/ob-julia hides /home/viz/lib/ports/emacs/lisp/org/ob-julia
/home/viz/lib/emacs/straight/build/org/ob-sqlite hides /home/viz/lib/ports/emacs/lisp/org/ob-sqlite
/home/viz/lib/emacs/straight/build/org/org-cycle hides /home/viz/lib/ports/emacs/lisp/org/org-cycle
/home/viz/lib/emacs/straight/build/org/org-faces hides /home/viz/lib/ports/emacs/lisp/org/org-faces
/home/viz/lib/emacs/straight/build/org/org-mobile hides /home/viz/lib/ports/emacs/lisp/org/org-mobile
/home/viz/lib/emacs/straight/build/org/org-ctags hides /home/viz/lib/ports/emacs/lisp/org/org-ctags
/home/viz/lib/emacs/straight/build/org/ob-latex hides /home/viz/lib/ports/emacs/lisp/org/ob-latex
/home/viz/lib/emacs/straight/build/org/ob-matlab hides /home/viz/lib/ports/emacs/lisp/org/ob-matlab
/home/viz/lib/emacs/straight/build/org/ob-sed hides /home/viz/lib/ports/emacs/lisp/org/ob-sed
/home/viz/lib/emacs/straight/build/org/org-attach-git hides /home/viz/lib/ports/emacs/lisp/org/org-attach-git
/home/viz/lib/emacs/straight/build/org/ob-python hides /home/viz/lib/ports/emacs/lisp/org/ob-python
/home/viz/lib/emacs/straight/build/org/ox-icalendar hides /home/viz/lib/ports/emacs/lisp/org/ox-icalendar
/home/viz/lib/emacs/straight/build/org/org-tempo hides /home/viz/lib/ports/emacs/lisp/org/org-tempo
/home/viz/lib/emacs/straight/build/org/ob-screen hides /home/viz/lib/ports/emacs/lisp/org/ob-screen
/home/viz/lib/emacs/straight/build/org/org-num hides /home/viz/lib/ports/emacs/lisp/org/org-num
/home/viz/lib/emacs/straight/build/org/ob-forth hides /home/viz/lib/ports/emacs/lisp/org/ob-forth
/home/viz/lib/emacs/straight/build/org/ox-odt hides /home/viz/lib/ports/emacs/lisp/org/ox-odt
/home/viz/lib/emacs/straight/build/org/ol-bbdb hides /home/viz/lib/ports/emacs/lisp/org/ol-bbdb
/home/viz/lib/emacs/straight/build/org/org-table hides /home/viz/lib/ports/emacs/lisp/org/org-table
/home/viz/lib/emacs/straight/build/org/ox-man hides /home/viz/lib/ports/emacs/lisp/org/ox-man
/home/viz/lib/emacs/straight/build/org/ox-org hides /home/viz/lib/ports/emacs/lisp/org/ox-org
/home/viz/lib/emacs/straight/build/org/ob-comint hides /home/viz/lib/ports/emacs/lisp/org/ob-comint
/home/viz/lib/emacs/straight/build/org/ob-clojure hides /home/viz/lib/ports/emacs/lisp/org/ob-clojure
/home/viz/lib/emacs/straight/build/org/org-id hides /home/viz/lib/ports/emacs/lisp/org/org-id
/home/viz/lib/emacs/straight/build/org/oc-natbib hides /home/viz/lib/ports/emacs/lisp/org/oc-natbib
/home/viz/lib/emacs/straight/build/org/ox-texinfo hides /home/viz/lib/ports/emacs/lisp/org/ox-texinfo
/home/viz/lib/emacs/straight/build/org/org-agenda hides /home/viz/lib/ports/emacs/lisp/org/org-agenda
/home/viz/lib/emacs/straight/build/org/org-src hides /home/viz/lib/ports/emacs/lisp/org/org-src
/home/viz/lib/emacs/straight/build/org/ob-emacs-lisp hides /home/viz/lib/ports/emacs/lisp/org/ob-emacs-lisp
/home/viz/lib/emacs/straight/build/org/ob-css hides /home/viz/lib/ports/emacs/lisp/org/ob-css
/home/viz/lib/emacs/straight/build/org/ox-latex hides /home/viz/lib/ports/emacs/lisp/org/ox-latex
/home/viz/lib/emacs/straight/build/org/oc hides /home/viz/lib/ports/emacs/lisp/org/oc
/home/viz/lib/emacs/straight/build/org/ol hides /home/viz/lib/ports/emacs/lisp/org/ol
/home/viz/lib/emacs/straight/build/org/org-element hides /home/viz/lib/ports/emacs/lisp/org/org-element
/home/viz/lib/emacs/straight/build/org/org hides /home/viz/lib/ports/emacs/lisp/org/org
/home/viz/lib/emacs/straight/build/org/org-goto hides /home/viz/lib/ports/emacs/lisp/org/org-goto
/home/viz/lib/emacs/straight/build/org/ob-eval hides /home/viz/lib/ports/emacs/lisp/org/ob-eval
/home/viz/lib/emacs/straight/build/org/org-habit hides /home/viz/lib/ports/emacs/lisp/org/org-habit
/home/viz/lib/emacs/straight/build/org/org-pcomplete hides /home/viz/lib/ports/emacs/lisp/org/org-pcomplete
/home/viz/lib/emacs/straight/build/org/ol-eww hides /home/viz/lib/ports/emacs/lisp/org/ol-eww
/home/viz/lib/emacs/straight/build/org/ob-processing hides /home/viz/lib/ports/emacs/lisp/org/ob-processing
/home/viz/lib/emacs/straight/build/org/org-timer hides /home/viz/lib/ports/emacs/lisp/org/org-timer
/home/viz/lib/emacs/straight/build/org/org-inlinetask hides /home/viz/lib/ports/emacs/lisp/org/org-inlinetask
/home/viz/lib/emacs/straight/build/org/ol-bibtex hides /home/viz/lib/ports/emacs/lisp/org/ol-bibtex
/home/viz/lib/emacs/straight/build/org/org-fold-core hides /home/viz/lib/ports/emacs/lisp/org/org-fold-core
/home/viz/lib/emacs/straight/build/org/oc-basic hides /home/viz/lib/ports/emacs/lisp/org/oc-basic
/home/viz/lib/emacs/straight/build/org/ox-publish hides /home/viz/lib/ports/emacs/lisp/org/ox-publish
/home/viz/lib/emacs/straight/build/org/oc-bibtex hides /home/viz/lib/ports/emacs/lisp/org/oc-bibtex
/home/viz/lib/emacs/straight/build/org/org-macro hides /home/viz/lib/ports/emacs/lisp/org/org-macro
/home/viz/lib/emacs/straight/build/org/ol-docview hides /home/viz/lib/ports/emacs/lisp/org/ol-docview
/home/viz/lib/emacs/straight/build/org/org-fold hides /home/viz/lib/ports/emacs/lisp/org/org-fold
/home/viz/lib/emacs/straight/build/org/org-lint hides /home/viz/lib/ports/emacs/lisp/org/org-lint
/home/viz/lib/emacs/straight/build/org/org-version hides /home/viz/lib/ports/emacs/lisp/org/org-version
/home/viz/lib/emacs/straight/build/org/ob-ocaml hides /home/viz/lib/ports/emacs/lisp/org/ob-ocaml
/home/viz/lib/emacs/straight/build/org/ob-sass hides /home/viz/lib/ports/emacs/lisp/org/ob-sass
/home/viz/lib/emacs/straight/build/org/ob-perl hides /home/viz/lib/ports/emacs/lisp/org/ob-perl
/home/viz/lib/emacs/straight/build/org/ol-rmail hides /home/viz/lib/ports/emacs/lisp/org/ol-rmail
/home/viz/lib/emacs/straight/build/org/org-protocol hides /home/viz/lib/ports/emacs/lisp/org/org-protocol
/home/viz/lib/emacs/straight/build/org/ol-info hides /home/viz/lib/ports/emacs/lisp/org/ol-info
/home/viz/lib/emacs/straight/build/org/ob-eshell hides /home/viz/lib/ports/emacs/lisp/org/ob-eshell
/home/viz/lib/emacs/straight/build/org/org-refile hides /home/viz/lib/ports/emacs/lisp/org/org-refile
/home/viz/lib/emacs/straight/build/org/ob-octave hides /home/viz/lib/ports/emacs/lisp/org/ob-octave
/home/viz/lib/emacs/straight/build/org/ob-lua hides /home/viz/lib/ports/emacs/lisp/org/ob-lua
/home/viz/lib/emacs/straight/build/org/ol-gnus hides /home/viz/lib/ports/emacs/lisp/org/ol-gnus
/home/viz/lib/emacs/straight/build/org/ob-makefile hides /home/viz/lib/ports/emacs/lisp/org/ob-makefile
/home/viz/lib/emacs/straight/build/org/org-archive hides /home/viz/lib/ports/emacs/lisp/org/org-archive
/home/viz/lib/emacs/straight/build/org/ob-lob hides /home/viz/lib/ports/emacs/lisp/org/ob-lob
/home/viz/lib/emacs/straight/build/org/ol-man hides /home/viz/lib/ports/emacs/lisp/org/ol-man
/home/viz/lib/emacs/straight/build/org/org-compat hides /home/viz/lib/ports/emacs/lisp/org/org-compat
/home/viz/lib/emacs/straight/build/org/org-colview hides /home/viz/lib/ports/emacs/lisp/org/org-colview
/home/viz/lib/emacs/straight/build/org/org-indent hides /home/viz/lib/ports/emacs/lisp/org/org-indent
/home/viz/lib/emacs/straight/build/org/ox-beamer hides /home/viz/lib/ports/emacs/lisp/org/ox-beamer
/home/viz/lib/emacs/straight/build/org/ob-calc hides /home/viz/lib/ports/emacs/lisp/org/ob-calc

Features:
(shadow emacsbug profiler rect tabify descr-text edebug dabbrev etags
fileloop url-cache url-auth gnus-dired mhtml-mode css-mode js
c-ts-common sgml-mode avy cl-print rfc2104 tramp-cmds tramp-cache
time-stamp ffap grep imenu-xref info-look xref bug-reference shortdoc
comp comp-cstr help-fns radix-tree flyspell ispell ecomplete smerge-mode
flow-fill mm-archive sort gnus-cite mail-extr textsec uni-scripts
idna-mapping ucs-normalize uni-confusable textsec-check gnus-async
gnus-bcklg gnus-ml network-stream nsm qp nndraft nnmh nndoc nnmaildir
nnagent nnml nnnil gnus-agent gnus-srvr gnus-score score-mode nnvirtual
gnus-msg nntp gnus-cache mule-util ement-tabulated-room-list ement
ement-notifications ement-notify notifications ement-room dns
ement-room-list ement-lib ement-api ement-structs plz ement-macros
taxy-magit-section magit-section benchmark taxy svg-lib persist
find-dired misearch multi-isearch pulse color shell-command+ dired-aux
face-remap org-pdftools pdf-annot facemenu org-noter oc-basic ob-gnuplot
ox-odt rng-loc rng-uri rng-parse rng-match rng-dt rng-util rng-pttrn
nxml-parse nxml-ns nxml-enc xmltok nxml-util ox-icalendar org-agenda
ox-html ox-mathml org-latex-preview ox-latex table ox-ascii ox-publish
ox org-element org-persist avl-tree generator ob-fortran ob-python
python compat compat-macs ob-C cc-mode cc-fonts cc-guess cc-menus
cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs ob-shell ob-racket
async ob-async cdlatex texmathp org-attach ol-eww eww url-queue mm-url
ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect gnus-art mm-uu mml2015
mm-view mml-smime smime gnutls dig gnus-sum shr pixel-fill kinsoku
url-file svg gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap
nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range message
sendmail yank-media puny rfc822 mml mml-sec epa epg rfc6068 epg-config
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums mailabbrev gmm-utils mailheader gnus-win gnus nnheader
gnus-util mail-utils range mm-util mail-prsvr ol-docview doc-view
ol-bibtex ol-bbdb ol-w3m ol-doi org-link-doi org-tempo org-id org-refile
org-element-ast ol-man org ob ob-tangle ob-ref ob-lob ob-table ob-exp
org-macro org-src sh-script smie treesit executable ob-comint
org-pcomplete org-list org-footnote org-faces org-entities noutline
outline ob-emacs-lisp ob-core ob-eval org-cycle org-table ol org-fold
org-fold-core org-keys oc org-loaddefs org-version org-compat org-macs
typo inline cursor-sensor recentf tree-widget vc-backup log-view
pcvs-util vc diff vc-git diff-mode vc-dispatcher server paredit edmacro
kmacro eros checkdoc lisp-mnt flymake project warnings thingatpt
wordel-autoloads mines-autoloads sokoban-autoloads ement-autoloads
svg-lib-autoloads taxy-magit-section-autoloads magit-section-autoloads
taxy-autoloads persist-autoloads plz-autoloads nov-autoloads
esxml-autoloads kv-autoloads transmission-autoloads csv-mode-autoloads
lua-mode-autoloads nix-mode-autoloads gnuplot-autoloads
go-mode-autoloads racket-mode-autoloads eros-autoloads
writegood-mode-autoloads siege-mode-autoloads paredit-autoloads
puni-autoloads expand-region-autoloads filladapt-autoloads compose
org-ql-autoloads transient-autoloads peg-autoloads ov-autoloads
org-super-agenda-autoloads ts-autoloads ht-autoloads f-autoloads
s-autoloads dash-autoloads scroll-other-window org-pdftools-autoloads
org-noter-autoloads change-env-autoloads math-delimiters-autoloads
doct-autoloads ob-async-autoloads async-autoloads
emacs-ob-racket-autoloads valign-autoloads cdlatex-autoloads
auctex-autoloads tex-site tempo bibtex pdf-occur ibuf-ext ibuffer
ibuffer-loaddefs tablist advice tablist-filter semantic/wisent/comp
semantic/wisent semantic/wisent/wisent semantic/util-modes semantic/util
semantic semantic/tag semantic/lex semantic/fw mode-local cedet
pdf-isearch let-alist pdf-misc imenu pdf-tools package browse-url url
url-proxy url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse
url-vars compile cus-edit wid-edit pdf-view jka-compr pdf-cache pdf-info
tq pdf-util pdf-macs image-mode dired-x dired dired-loaddefs exif
pdf-tools-autoloads tablist-autoloads typo-autoloads mb-depth repeat
visual-fill-autoloads olivetti-autoloads time battery filenotify dom
tamil99 quail disp-table lacarte-autoloads shell-command-plus-autoloads
icons delsel easy-mmode xt-mouse cus-load avy-autoloads icalendar
diary-lib diary-loaddefs cal-menu calendar cal-loaddefs
dired-du-autoloads finder-inf filecache imenu-xref-autoloads ert ewoc
debug backtrace find-func derived chemtable-autoloads
molar-mass-autoloads vc-backup-autoloads compat-autoloads skeleton
saveplace-pdf-view saveplace tramp-sh tramp trampver tramp-integration
files-x tramp-message tramp-compat xdg shell pcomplete comint ansi-osc
ring parse-time iso8601 time-date format-spec auth-source eieio
eieio-core password-cache json map byte-opt ansi-color tramp-loaddefs
bookmark text-property-search pp saveplace-pdf-view-autoloads dbus xml
rx inspector-autoloads xr-autoloads org-mode-autoloads pcase
straight-autoloads cl-seq info cl-extra help-mode straight subr-x
cl-macs gv cl-loaddefs cl-lib bytecomp byte-compile vz-nh-theme
vz-options-theme rmc iso-transl tooltip cconv eldoc paren electric
uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/x-win x-win term/common-win x-dnd touch-screen tool-bar dnd fontset
image regexp-opt fringe tabulated-list replace newcomment text-mode
lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo x-toolkit
xinput2 x multi-tty move-toolbar make-network-process emacs)

Memory information:
((conses 16 1687687 8363735) (symbols 48 73938 4205)
 (strings 32 384920 270420) (string-bytes 1 16256758)
 (vectors 16 168975) (vector-slots 8 3621518 2304377)
 (floats 8 6119 25915) (intervals 56 88125 34648) (buffers 984 75))

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#66512; Package emacs. (Fri, 13 Oct 2023 06:39:01 GMT) Full text and rfc822 format available.

Message #8 received at 66512 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Visuwesh <visuweshm <at> gmail.com>
Cc: 66512 <at> debbugs.gnu.org
Subject: Re: bug#66512: 30.0.50;
 flymake with checkdoc slows down typing in large Elisp buffers
Date: Fri, 13 Oct 2023 09:37:35 +0300
> From: Visuwesh <visuweshm <at> gmail.com>
> Date: Fri, 13 Oct 2023 11:23:31 +0530
> 
> flymake-mode is largely unusable in large Elisp buffers with checkdoc
> enabled as it sometimes takes a second for the typed words to be
> displayed, and there are too many micro freezes.  I have attached two
> profiles one from emacs -Q, and one from my personal configuration saved
> using the command profiler-report-write-profile.  Both point to
> checkdoc-this-string-valid being the time consuming function.
> 
> To reproduce,
> 
>     1. src/emacs -Q
>     2. C-x C-f lisp/org/org.el RET
>     3. M-x flymake-mode RET
>     4. M-g i org-drag-line-forward RET
>     5. Move the point to be inside the docstring, and start typing away.
>        You should notice the latency sooner or later.
> 
> I can reproduce this in my fairly long init.el file too (~10k lines) and
> I was forced to turn off checkdoc for the typing to be bearable in my
> init.el file.

Thanks.

This report needs more info:

  . the file you used which produces this slowdown
  . the profile is not fully expanded (some functions have "+")
  . for more detailed profile, please load the relevant Lisp files as
    *.el (not *.elc), and repeat the profiling
  . if the slowdown is visible in "emacs -Q", the profile from that is
    more important than the one from your customized Emacs




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#66512; Package emacs. (Sat, 14 Oct 2023 09:31:02 GMT) Full text and rfc822 format available.

Message #11 received at 66512 <at> debbugs.gnu.org (full text, mbox):

From: Visuwesh <visuweshm <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 66512 <at> debbugs.gnu.org
Subject: Re: bug#66512: 30.0.50; flymake with checkdoc slows down typing in
 large Elisp buffers
Date: Sat, 14 Oct 2023 14:59:29 +0530
[Message part 1 (text/plain, inline)]
[வெள்ளி அக்டோபர் 13, 2023] Eli Zaretskii wrote:

>> From: Visuwesh <visuweshm <at> gmail.com>
>> Date: Fri, 13 Oct 2023 11:23:31 +0530
>> 
>> flymake-mode is largely unusable in large Elisp buffers with checkdoc
>> enabled as it sometimes takes a second for the typed words to be
>> displayed, and there are too many micro freezes.  I have attached two
>> profiles one from emacs -Q, and one from my personal configuration saved
>> using the command profiler-report-write-profile.  Both point to
>> checkdoc-this-string-valid being the time consuming function.
>> 
>> To reproduce,
>> 
>>     1. src/emacs -Q
>>     2. C-x C-f lisp/org/org.el RET
>>     3. M-x flymake-mode RET
>>     4. M-g i org-drag-line-forward RET
>>     5. Move the point to be inside the docstring, and start typing away.
>>        You should notice the latency sooner or later.
>> 
>> I can reproduce this in my fairly long init.el file too (~10k lines) and
>> I was forced to turn off checkdoc for the typing to be bearable in my
>> init.el file.
>
> Thanks.
>
> This report needs more info:
>
>   . the file you used which produces this slowdown

I used org.el in the example.

>   . the profile is not fully expanded (some functions have "+")
>   . for more detailed profile, please load the relevant Lisp files as
>     *.el (not *.elc), and repeat the profiling
>   . if the slowdown is visible in "emacs -Q", the profile from that is
>     more important than the one from your customized Emacs

Here's the fully expanded profile after evaluating the checkdoc.el
library in emacs -Q.  I also attached the file written by
profiler-report-write-profile too.

There are still a couple compiled functions but I think they are safe to
ignore for now.

        3260  67% - timer-event-handler
        3260  67%  - apply
        3260  67%   - #<compiled 0x1f6faae8cb95a424>
        3260  67%    - flymake-start
        3260  67%     - run-hook-wrapped
        3260  67%      - #<compiled -0x280737ed0d75cb0>
        3260  67%       - flymake--run-backend
        3260  67%        - apply
        3239  67%         - elisp-flymake-checkdoc
        3231  67%          - checkdoc-current-buffer
        3231  67%           - let
        3231  67%            - or
        2655  55%             - checkdoc-start
        2655  55%              - let
        2655  55%               - checkdoc-continue
        2655  55%                - let
        2655  55%                 - save-excursion
        2655  55%                  - while
        2037  42%                   - setq
        2037  42%                    - checkdoc-this-string-valid
        2033  42%                     - let
        1123  23%                      - if
        1123  23%                       - let
        1115  23%                        - unwind-protect
        1115  23%                         - progn
        1115  23%                          - checkdoc-this-string-valid-engine
        1115  23%                           - let
        1103  22%                            - or
         699  14%                             - save-excursion
         348   7%                              - let*
         252   5%                               - while
         248   5%                                - and
         244   5%                                 - or
         244   5%                                  - progn
         224   4%                                   - <
         220   4%                                      current-column
           4   0%                                      funcall
          20   0%                                     end-of-line
           4   0%                                 - <
           4   0%                                    point
           4   0%                                  forward-line
          84   1%                               - function
          84   1%                                - cconv-make-interpreted-closure
          44   0%                                 - cconv-fv
          36   0%                                  - cconv-analyze-form
          28   0%                                   - cconv--analyze-function
           8   0%                                    - cconv-analyze-form
           4   0%                                     - #<compiled 0x1e3233529d73ee4f>
           4   0%                                        cconv-analyze-form
           4   0%                                    - mapcar
           4   0%                                       #<compiled -0x1ee9fee790b185f2>
           4   0%                                    make-closure
          32   0%                                 - macroexpand-all
          28   0%                                  - macroexp--expand-all
          24   0%                                   - macroexp--all-forms
          20   0%                                    - macroexp--expand-all
          20   0%                                     - #<compiled 0x19f73f8625989308>
           8   0%                                      - macroexp--all-forms
           4   0%                                         macroexp--expand-all
           8   0%                                      - function-get
           4   0%                                         fboundp
           4   0%                                 end-of-line
         307   6%                              - let
         307   6%                               - while
         179   3%                                - and
         135   2%                                   re-search-forward
          44   0%                                 + setq
         108   2%                                + if
          12   0%                                + let*
           8   0%                                + setq
          20   0%                              + if
           8   0%                              + cond
           4   0%                                skip-chars-backward
           4   0%                                beginning-of-line
           4   0%                                forward-line
         172   3%                             + cond
         104   2%                             + checkdoc-sentencespace-region-engine
          76   1%                             + checkdoc-proper-noun-region-engine
          36   0%                             + let
           8   0%                               checkdoc-ispell-docstring-engine
           8   0%                             + if
          12   0%                            + if
           4   0%                          syntax-table
         910  18%                      + checkdoc-defun-info
           4   0%                     + while
         618  12%                   + and
         304   6%             + checkdoc-rogue-spaces
         272   5%             + checkdoc-message-text
           8   0%          - #<compiled 0x1f518ae41b6bfdca>
           8   0%           - apply
           8   0%            - flymake--handle-report
           8   0%             - flymake--publish-diagnostics
           4   0%              - flymake--highlight-line
           4   0%                 #<compiled 0x45577ddd5ec64ee>
           4   0%              - flymake--delete-overlay
           4   0%                 delete-overlay
          21   0%         - elisp-flymake-byte-compile
          21   0%            write-region
        1324  27%   Automatic GC
         146   3% - redisplay_internal (C function)
          17   0%  - jit-lock-function
          17   0%   - jit-lock-fontify-now
          17   0%    - jit-lock--run-functions
          17   0%     - run-hook-wrapped
          17   0%      - #<compiled -0x72b32c146f17ee7>
          17   0%       + font-lock-fontify-region
           8   0%  - eval
           4   0%   - flymake--mode-line-counter
           4   0%    - flymake--mode-line-counter-1
           4   0%     - flymake--severity
           4   0%      - flymake--lookup-type-property
           4   0%         plist-member
           4   0%   - flymake--mode-line-title
           4   0%      make-sparse-keymap
           1   0%  - redisplay--pre-redisplay-functions
           1   0%     run-hook-with-args
           1   0%  - file-remote-p
           1   0%     find-file-name-handler
          72   1% - command-execute
          72   1%  - call-interactively
          65   1%   - byte-code
          65   1%    - read-extended-command
          65   1%     - read-extended-command-1
          65   1%      - completing-read
          65   1%       - completing-read-default
          65   1%        - read-from-minibuffer
          25   0%           redisplay_internal (C function)
          10   0%         - timer-event-handler
          10   0%          - apply
          10   0%           - #<compiled 0x1f6faae8cb95a424>
          10   0%            - flymake-start
          10   0%             - run-hook-wrapped
          10   0%              - #<compiled -0x286221700d75cb0>
          10   0%               - flymake--run-backend
          10   0%                - apply
          10   0%                 - elisp-flymake-byte-compile
          10   0%                  - write-region
           4   0%                   - make-lock-file-name
           4   0%                      find-file-name-handler
           7   0%   + funcall-interactively
           9   0% - #<compiled 0x9076c9ab87f5262>
           9   0%  - flymake--log-1
           9   0%   - display-warning
           9   0%    - icon-string
           9   0%     - icons--create
           9   0%      - apply
           9   0%       - #<compiled 0x1960f398ac366a51>
           9   0%          internal-char-font
           7   0% - clear-minibuffer-message
           7   0%    timerp
           2   0% - jit-lock--antiblink-post-command
           2   0%  - syntax-ppss
           2   0%   - syntax-propertize
           2   0%      make-local-variable
           0   0%   ...

[emacs-Q-checkdoc-evald.eld (application/octet-stream, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#66512; Package emacs. (Sat, 14 Oct 2023 10:22:01 GMT) Full text and rfc822 format available.

Message #14 received at 66512 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Visuwesh <visuweshm <at> gmail.com>
Cc: 66512 <at> debbugs.gnu.org
Subject: Re: bug#66512: 30.0.50; flymake with checkdoc slows down typing in
 large Elisp buffers
Date: Sat, 14 Oct 2023 13:20:48 +0300
> From: Visuwesh <visuweshm <at> gmail.com>
> Cc: 66512 <at> debbugs.gnu.org
> Date: Sat, 14 Oct 2023 14:59:29 +0530
> 
> [வெள்ளி அக்டோபர் 13, 2023] Eli Zaretskii wrote:
> 
> >>     1. src/emacs -Q
> >>     2. C-x C-f lisp/org/org.el RET
> >>     3. M-x flymake-mode RET
> >>     4. M-g i org-drag-line-forward RET
> >>     5. Move the point to be inside the docstring, and start typing away.
> >>        You should notice the latency sooner or later.
> >> 
> >> I can reproduce this in my fairly long init.el file too (~10k lines) and
> >> I was forced to turn off checkdoc for the typing to be bearable in my
> >> init.el file.
> >
> > Thanks.
> >
> > This report needs more info:
> >
> >   . the file you used which produces this slowdown
> 
> I used org.el in the example.
> 
> >   . the profile is not fully expanded (some functions have "+")
> >   . for more detailed profile, please load the relevant Lisp files as
> >     *.el (not *.elc), and repeat the profiling
> >   . if the slowdown is visible in "emacs -Q", the profile from that is
> >     more important than the one from your customized Emacs
> 
> Here's the fully expanded profile after evaluating the checkdoc.el
> library in emacs -Q.  I also attached the file written by
> profiler-report-write-profile too.

Thanks.  It looks like the hot spots are:

   . the call to checkdoc-defun-info
   . this snippet from checkdoc-this-string-valid-engine:

     (save-excursion
       (forward-line 1)
       (beginning-of-line)
       (if (and (< (point) e)
		(looking-at "\\([ \t]+\\)[^ \t\n]"))
	   (if (checkdoc-autofix-ask-replace (match-beginning 1)
					     (match-end 1)
                                             "Remove this whitespace?"
					     "")
	       nil
	     (checkdoc-create-error
	      "Second line should not have indentation"
	      (match-beginning 1)
	      (match-end 1)))))
   
The rest is taken by GC, AFAICT.




This bug report was last modified 1 year and 245 days ago.

Previous Next


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