GNU bug report logs - #76609
31.0.50; The 0.1s repeat timer is very CPU-intensive; it might be a bug?

Previous Next

Package: emacs;

Reported by: Eval Exec <execvy <at> gmail.com>

Date: Thu, 27 Feb 2025 13:57:02 UTC

Severity: normal

Found in version 31.0.50

To reply to this bug, email your comments to 76609 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#76609; Package emacs. (Thu, 27 Feb 2025 13:57:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Eval Exec <execvy <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 27 Feb 2025 13:57:03 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 31.0.50; The 0.1s repeat timer is very CPU-intensive; it might be a
 bug?
Date: Thu, 27 Feb 2025 21:55:40 +0800
Hello,

I a 0.1 s repeat timer in emacs -Q, then Emacs's the cpu usage is 30% ~
70%.
I think it's a bug.

You can reproduce it by:

(defun exec/emacs-lisp-machine-update()
  ;; do nothing
)
(progn
  (defvar exec/emacs-lisp-machine-timer nil)
  (when (timerp exec/emacs-lisp-machine-timer)
  (cancel-timer exec/emacs-lisp-machine-timer))
  (setq exec/emacs-lisp-machine-timer
  (run-with-timer 0.0 0.1 'exec/emacs-lisp-machine-update))
)


Then you will notice, the Emacs's cpu usage is 30% ~ 70, or you can
chang 0.1 to 0.05, 0.01 to feel the high cpu usage.

Eval Exec



In GNU Emacs 31.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.43, cairo version 1.18.2) of 2025-02-27 built on Mufasa
Repository revision: 5815bd52279fdedc752f9f92ace86f8243fbd604
Repository branch: master
System Description: NixOS 24.11 (Vicuna)

Configured using:
 'configure 'CFLAGS=-O3 -march=native'
 CPPFLAGS=-I/home/exec/soft/mps_artifacts_O3
 LDFLAGS=-I/home/exec/soft/mps_artifacts_O3
 --prefix=/home/exec/Projects/git.savannah.gnu.org/git/emacs-build/master-5815bd52279fdedc752f9f92ace86f8243fbd604-O3
 --with-imagemagick --with-mps=yes --with-modules --with-pgtk
 --with-cairo --with-cairo-xcb --without-compress-install
 --with-mailutils --with-tree-sitter --with-xinput2
 --with-native-compilation=aot --enable-link-time-optimization
 --with-file-notification=inotify'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ
IMAGEMAGICK JPEG LCMS2 LIBOTF LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM GTK3 ZLIB

Important settings:
  value of $LC_COLLATE: C
  value of $LC_MONETARY: en_US.UTF-8
  value of $LC_NUMERIC: en_US.UTF-8
  value of $LC_TIME: en_US.UTF-8
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=fcitx
  locale-coding-system: utf-8-unix

Major mode: ELisp/l

Minor modes in effect:
  restore-point-mode: t
  global-atomic-chrome-edit-mode: t
  marginalia-mode: t
  rainbow-mode: t
  elisp-autofmt-mode: t
  highlight-defined-mode: t
  elisp-def-mode: t
  highlight-numbers-mode: t
  hes-mode: t
  rainbow-delimiters-mode: t
  breadcrumb-local-mode: t
  copilot-mode: t
  keycast-tab-bar-mode: t
  vertico-truncate-mode: t
  vertico-multiform-mode: t
  vertico-mode: t
  telega-root-auto-fill-mode: t
  telega-contact-birthdays-mode: t
  telega-active-video-chats-mode: t
  telega-active-locations-mode: t
  telega-patrons-mode: t
  telega-active-stories-mode: t
  tab-line-nerd-icons-global-mode: t
  global-tab-line-mode: t
  tab-line-mode: t
  org-roam-db-autosync-mode: t
  global-org-modern-mode: t
  mu4e-modeline-mode: t
  global-git-commit-mode: t
  treemacs-git-commit-diff-mode: t
  treemacs-project-follow-mode: t
  treemacs-filewatch-mode: t
  treemacs-follow-mode: t
  treemacs-git-mode: t
  treemacs-fringe-indicator-mode: t
  global-hungry-delete-mode: t
  hungry-delete-mode: t
  global-anzu-mode: t
  anzu-mode: t
  engine-mode: t
  symex-mode: t
  global-evil-surround-mode: t
  evil-surround-mode: t
  global-diff-hl-show-hunk-mouse-mode: t
  diff-hl-show-hunk-mouse-mode: t
  diff-hl-flydiff-mode: t
  diff-hl-margin-local-mode: t
  diff-hl-margin-mode: t
  global-diff-hl-mode: t
  diff-hl-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  corfu-terminal-mode: t
  corfu-popupinfo-mode: t
  global-corfu-mode: t
  corfu-mode: t
  burly-tabs-mode: t
  global-form-feed-st-mode: t
  form-feed-st-mode: t
  eat-eshell-mode: t
  sly-symbol-completion-mode: t
  super-save-mode: t
  savehist-mode: t
  which-key-mode: t
  super-hint-xref-mode: t
  super-hint-rg-mode: t
  windmove-mode: t
  server-mode: t
  save-place-mode: t
  recentf-mode: t
  winner-mode: t
  persistent-scratch-autosave-mode: t
  global-dash-fontify-mode: t
  dash-fontify-mode: t
  nerd-icons-completion-mode: t
  sudo-edit-indicator-mode: t
  global-evil-visualstar-mode: t
  evil-visualstar-mode: t
  evil-commentary-mode: t
  global-evil-mc-mode: t
  evil-mc-mode: t
  evil-lion-mode: t
  global-evil-collection-unimpaired-mode: t
  evil-collection-unimpaired-mode: t
  buffer-face-mode: t
  TeX-PDF-mode: t
  display-line-numbers-mode: t
  electric-pair-mode: t
  el-patch-use-package-mode: t
  global-auto-revert-mode: t
  evil-mode: t
  evil-local-mode: t
  general-override-mode: t
  minions-mode: t
  elpaca-use-package-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tab-bar-mode: t
  file-name-shadow-mode: t
  context-menu-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  column-number-mode: -1
  line-number-mode: -1
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  hs-minor-mode: t

Load-path shadows:
/home/exec/.emacs.d/elpaca/builds/lispy/elpa hides /home/exec/.emacs.d/elpaca/builds/ivy/elpa
/home/exec/.emacs.d/elpaca/builds/modus-themes/theme-loaddefs hides /home/exec/.emacs.d/elpaca/builds/standard-themes/theme-loaddefs
/home/exec/.emacs.d/elpaca/builds/modus-themes/theme-loaddefs hides /home/exec/.emacs.d/elpaca/builds/ef-themes/theme-loaddefs
/home/exec/.emacs.d/elpaca/builds/modus-themes/theme-loaddefs hides /home/exec/Projects/git.savannah.gnu.org/git/emacs-build/master-5815bd52279fdedc752f9f92ace86f8243fbd604-O3/share/emacs/31.0.50/lisp/theme-loaddefs
/home/exec/.emacs.d/elpaca/builds/transient/transient hides /home/exec/Projects/git.savannah.gnu.org/git/emacs-build/master-5815bd52279fdedc752f9f92ace86f8243fbd604-O3/share/emacs/31.0.50/lisp/transient

Features:
(shadow sort mail-extr evil-collection-shortdoc shortdoc info-colors
cus-start tabify descr-text evil-collection-woman woman gptel-context
gptel-transient gptel-curl toml-ts-mode evil-collection-timer-list
timer-list expand-region yaml-mode-expansions subword-mode-expansions
text-mode-expansions cc-mode-expansions the-org-mode-expansions
python-el-fgallina-expansions latex-mode-expansions js2-mode-expansions
js-mode-expansions web-mode-expansions html-mode-expansions
clojure-mode-expansions er-basic-expansions expand-region-core
expand-region-custom dabbrev cape lsp-diagnostics lsp-modeline lsp-icons
nerd-icons-dired diredfl lsp-zig lsp-yang lsp-yaml lsp-xml lsp-wgsl
lsp-volar lsp-vimscript lsp-vhdl lsp-vetur lsp-html lsp-verilog lsp-vala
lsp-v lsp-typespec lsp-typeprof lsp-ttcn3 lsp-ts-query lsp-trunk
lsp-toml lsp-tilt lsp-tex lsp-terraform lsp-svelte lsp-steep lsp-sqls
lsp-sql lsp-sorbet lsp-solidity lsp-solargraph lsp-semgrep lsp-ruff
lsp-ruby-syntax-tree lsp-ruby-lsp lsp-rubocop lsp-roslyn lsp-roc lsp-rf
lsp-remark lsp-racket lsp-r lsp-qml lsp-pyright lsp-pylsp lsp-pyls
lsp-pwsh lsp-purescript lsp-pls lsp-php lsp-perlnavigator lsp-perl
lsp-openscad lsp-ocaml lsp-nushell lsp-nix lsp-nim lsp-nginx
lsp-nextflow lsp-move lsp-mojo lsp-mint lsp-meson lsp-mdx lsp-matlab
lsp-marksman lsp-markdown lsp-magik lsp-fennel lsp-lua lsp-lisp
lsp-kubernetes-helm lsp-kotlin lsp-json lsp-jq lsp-javascript lsp-idris
lsp-haxe lsp-hack lsp-groovy lsp-graphql lsp-golangci-lint lsp-glsl
lsp-gleam lsp-gdscript lsp-fsharp lsp-futhark lsp-fortran lsp-eslint
lsp-erlang lsp-emmet lsp-elm lsp-elixir lsp-earthly lsp-dockerfile
lsp-dhall lsp-d lsp-cypher lsp-cucumber lsp-copilot lsp-css lsp-c3
lsp-csharp lsp-crystal lsp-credo lsp-cobol lsp-cmake lsp-clojure
lsp-clangd lsp-bufls lsp-go lsp-completion lsp-beancount lsp-bash
lsp-awk lsp-autotools lsp-astro lsp-asm lsp-ansible lsp-angular lsp-ada
lsp-actionscript vertico-grid symbol-overlay eee org-indent org-download
image-file image-converter oc-basic ol-eww ol-rmail ol-mhe ol-irc
ol-info ol-gnus nnselect ol-docview evil-collection-doc-view doc-view
jka-compr ol-bibtex bibtex ol-bbdb ol-w3m ol-doi org-link-doi gptel-org
gptel-gemini gptel-ollama gptel-openai consult-dir-autoloads
consult-ag-autoloads restore-point evil-collection-atomic-chrome
atomic-chrome marginalia rainbow-mode elisp-autofmt highlight-defined
elisp-def evil-collection-ert ert highlight-numbers parent-mode
highlight-escape-sequences rainbow-delimiters breadcrumb copilot
copilot-balancer editorconfig editorconfig-core editorconfig-core-handle
editorconfig-fnmatch jsonrpc keycast zig-mode reformatter empv
vertico-truncate vertico-posframe vertico-multiform
evil-collection-vertico vertico lsp-uniteai nix-ts-mode go-translate
gt-text-utility gt-engine-echo gt-engine-libre gt-engine-chatgpt
gt-engine-youdao gt-engine-stardict gt-engine-deepl gt-engine-google-rpc
gt-engine-google gt-engine-bing gt-extension gt-faces gt-core gt-httpx
sdcv cap-words superword subword evil-collection-telega telega-obsolete
telega telega-tdlib-events telega-match telega-root telega-info
telega-chat telega-modes telega-company telega-emoji telega-user
telega-notifications telega-voip telega-msg telega-story telega-webpage
telega-tme telega-sticker telega-vvnote telega-ffplay telega-i18n
telega-sort telega-filter telega-ins telega-inline telega-util
telega-folders telega-topic telega-media telega-tdlib telega-server
telega-core telega-customize emacsbug tab-line-nerd-icons
evil-collection-imenu-list imenu-list hide-comnt hideshow tab-line
rust-utils rust-mode-treesitter rust-ts-mode rust-mode rust-playpen
rust-cargo rust-common rust-rustfmt rust-compile cargo cargo-process
toml rg-info-hack rg-menu rg-ibuffer rg-result wgrep-rg rg-history
ibuf-ext evil-collection-ibuffer ibuffer ibuffer-loaddefs rg-header
evil-collection-ultra-scroll ultra-scroll pixel-scroll cua-base
org-sliced-images evil-collection-org-roam org-roam-migrate org-roam-log
org-roam-mode org-roam-capture org-roam-id org-roam-node org-roam-db
emacsql-sqlite-builtin sqlite org-roam-utils org-roam-compat org-roam
org-capture org-journal org-crypt cal-iso org-modern orderless
evil-collection-mu4e mu4e mu4e-org mu4e-notification mu4e-main smtpmail
mu4e-view mu4e-mime-parts mu4e-headers mu4e-thread mu4e-actions
mu4e-compose mu4e-draft gnus-msg gnus-art mm-uu mml2015 gnus-sum
gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail
mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win mu4e-search
mu4e-lists mu4e-bookmarks mu4e-mark mu4e-message flow-fill mu4e-contacts
mu4e-update mu4e-folders mu4e-context mu4e-query-items mu4e-server
mu4e-modeline mu4e-vars mu4e-helpers mu4e-config mu4e-window ido
mu4e-obsolete cyphejor rfc-mode string-inflection systemd minuet
pr-review pr-review-render pr-review-action pr-review-input
pr-review-api pr-review-common evil-collection-forge forge-repos
forge-tablist forge-topics forge-commands forge-semi forge-bitbucket
buck forge-gogs gogs forge-gitea gtea forge-gitlab glab forge-github
ghub-graphql treepy gsexp ghub forge-forgejo forge-notify forge-revnote
forge-pullreq forge-issue forge-topic eieio-custom bug-reference
forge-post forge-repo forge forge-core forge-db closql emacsql-sqlite
emacsql emacsql-compiler eieio-base treemacs-magit magit-bookmark
evil-collection-magit magit-submodule magit-blame magit-stash
magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone
magit-remote magit-commit magit-sequence magit-notes magit-worktree
magit-tag magit-merge magit-branch magit-reset magit-files magit-refs
magit-status magit evil-collection-magit-repos magit-repos magit-apply
magit-wip magit-log which-func magit-diff git-commit magit-core
magit-autorevert magit-margin magit-transient magit-process
evil-collection-with-editor with-editor magit-mode magit-git magit-base
dap-java dap-mode dap-tasks dap-launch lsp-docker yaml dap-overlays
lsp-java treemacs-nerd-icons lsp-treemacs lsp-treemacs-generic
lsp-treemacs-themes treemacs-treelib treemacs-git-commit-diff-mode
treemacs-project-follow-mode treemacs-mouse-interface zoom treemacs
treemacs-header-line treemacs-compatibility treemacs-mode
treemacs-bookmarks treemacs-tags treemacs-interface treemacs-persistence
treemacs-filewatch-mode treemacs-follow-mode treemacs-rendering
treemacs-annotations treemacs-async treemacs-workspaces treemacs-dom
treemacs-visuals treemacs-fringe-indicator treemacs-faces treemacs-icons
treemacs-scope treemacs-themes treemacs-core-utils pfuture
treemacs-logging treemacs-customization treemacs-macros consult-lsp
lsp-ui lsp-ui-flycheck lsp-ui-doc evil-collection-lsp-ui-imenu
lsp-ui-imenu lsp-ui-peek lsp-ui-sideline lsp-rust lsp-semantic-tokens
lsp-mode network-stream evil-collection-markdown-mode markdown-mode
lsp-ui-util lsp-protocol llm-prompt groovy-mode iedit iedit-lib
evil-collection-hungry-delete hungry-delete minibuffer-header
gptel-quick gotest fzf flycheck-clj-kondo pos-tip consult-flycheck
evil-collection-flycheck flycheck evil-anzu anzu engine-mode
evil-collection-ement ement-room-list taxy-magit-section taxy ement
ement-notifications ement-notify ement-room ement-lib ement-api
ement-structs ement-macros dns llm-ollama llm-provider-utils llm-models
llm-request-plz plz-event-source plz-media-type plz llm symex symex-evil
symex-evil-support symex-hydra symex-transformations
symex-transformations-lisp symex-utils evil-cleverparens
evil-cleverparens-text-objects evil-cleverparens-util smartparens
loadhist evil-surround symex-misc symex-interface-builtins
symex-interface-fennel symex-interface-arc symex-interface-common-lisp
symex-interface-clojure symex-interface-scheme symex-interface-racket
symex-interface-elisp symex-interop symex-interface symex-traversals
symex-dsl symex-evaluator symex-computations symex-primitives symex-ts
symex-utils-ts symex-transformations-ts symex-primitives-lisp symex-data
symex-ui symex-custom evil-collection-lispy lispy le-clojure delsel
lispy-inline avy lispy-tags zoutline combobulate evil-collection-elfeed
elfeed-show elfeed-search elfeed-csv elfeed elfeed-curl elfeed-log
elfeed-db elfeed-lib xml-query dired-git-info dired-hacks dired-preview
diff-hl-show-hunk diff-hl-inline-popup diff-hl-flydiff diff-hl-margin
diff-hl-dired evil-collection-diff-hl diff-hl evil-collection-log-view
log-view evil-collection-log-edit log-edit add-log pcvs-util
evil-collection-vc-dir vc-dir ewoc evil-collection-cmake-mode cmake-mode
consult-yasnippet yasnippet-capf yasnippet-snippets yasnippet kind-icon
svg-lib corfu-terminal popon corfu-popupinfo corfu-indexed
evil-collection-corfu corfu paredit clojure-ts-mode
evil-collection-cider cider tramp-sh cider-debug cider-browse-ns
cider-mode cider-xref-backend cider-find cider-inspector
cider-completion cider-profile cider-eval cider-jar cider-repl-history
pulse cider-repl cider-resolve cider-test cider-overlays
cider-stacktrace cider-doc cider-browse-spec cider-clojuredocs
cider-eldoc cider-docstring cider-client cider-common
cider-completion-context cider-connection cider-popup sesman-browser
nrepl-client cider-util sesman queue nrepl-dict spinner clojure-mode
chatgpt-shell chatgpt-shell-openrouter chatgpt-shell-perplexity
chatgpt-shell-openai chatgpt-shell-ollama chatgpt-shell-kagi
chatgpt-shell-google chatgpt-shell-anthropic
chatgpt-shell-prompt-compose evil-collection-smerge-mode smerge-mode
diff shell-maker ielm evil-collection-eshell eshell em-prompt esh-mode
esh-var esh-cmd esh-ext esh-proc esh-opt esh-io esh-arg esh-module
esh-module-loaddefs esh-util bookmark-in-project bookmark+ bookmark+-key
bookmark+-1 bookmark+-bmu bookmark+-lit babashka parseedn
parseclj-parser parseclj-lex parseclj-alist cnfonts burly-tabs burly
frameset compile-multi form-feed-st google-this echo-bar fcitx
evil-collection-eat eat term/xterm xterm evil-collection-term term ehelp
ox-reveal 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-latex
ox-icalendar org-agenda ox-html table ox-ascii ox-publish ox org-attach
org-element org-persist org-id org-refile org-element-ast inline
avl-tree htmlize evil-collection-explain-pause-mode explain-pause-mode
explain-pause-top explain-pause-log-to-socket evil-collection-profiler
profiler weather-metno solar cal-dst url-cache display-wttr kdeconnect
crux pest-mode popwin modus-themes blackboard-theme standard-themes
nimbus-theme tok-theme danneskjold-theme srcery-theme subatomic256-theme
iscroll xml+ evil-textobj-tree-sitter
evil-textobj-tree-sitter-thing-at-point evil-textobj-tree-sitter-core
tree-sitter tree-sitter-load tree-sitter-cli tsc tsc-dyn tsc-dyn-get
dired-aux tsc-obsolete ctable line-reminder ov ht fringe-helper
solarized-theme solarized solarized-faces sqlup-mode evil-collection-bm
bm zen-mode evil-collection-sly sly sly-completion sly-buttons
sly-messages sly-common evil-collection-apropos apropos
evil-collection-arc-mode arc-mode archive-mode hyperspec sicp
base16-theme idea-darkula-theme hybrid-reverse-theme material-theme
doom-themes doom-themes-base nyan-mode organic-green-theme inkpot-theme
github-dark-vscode-theme almost-mono-themes cyberpunk-theme soothe-theme
soothe-tva zenburn-theme mindre-theme kaolin-themes kaolin-themes-lib
tron-legacy-theme wildcharm-theme atom-one-dark-theme parchment-theme
autothemer visual-fill-column transpose-frame gameoflife
evil-collection-docker docker docker-context docker-volume
docker-network docker-image docker-container docker-faces docker-core
docker-compose docker-process docker-utils docker-group dockerfile-mode
emacs-everywhere cus-dir dumb-jump evil-collection-popup popup websocket
bindat bing-dict bing-dict-cache hl-todo atom-dark-theme ef-themes
uwu-theme vagrant evil-collection-ag ag vc-svn find-dired alarm-clock
alert notifications gntp pinentry evil-collection-hackernews hackernews
evil-collection-notmuch notmuch notmuch-tree notmuch-jump notmuch-hello
notmuch-show notmuch-print notmuch-crypto notmuch-mua notmuch-message
notmuch-draft notmuch-maildir-fcc notmuch-address notmuch-company
notmuch-parser notmuch-wash coolj goto-addr icalendar diary-lib
diary-loaddefs notmuch-tag notmuch-lib notmuch-compat message sendmail
yank-media rfc822 mml mailabbrev gmm-utils mm-view mml-smime mml-sec
smime gnutls dig mm-decode mm-bodies mm-encode fussy flx affe
evil-collection-consult consult clang-format apheleia apheleia-rcs
apheleia-dp apheleia-formatters apheleia-utils apheleia-log
apheleia-formatter-context vimrc-mode gnuplot olivetti super-save
evil-collection-helpful helpful cc-langs trace cl-print
evil-collection-edebug edebug evil-collection-debug debug backtrace
info-look evil-collection-info info help-fns radix-tree
evil-collection-elisp-refs elisp-refs solidity-mode solidity-common
evil-collection-git-timemachine git-timemachine web-mode disp-table
evil-collection-go-mode go-mode find-file evil-collection-js2-mode
js2-mode etags fileloop zig-mode-autoloads reformatter-autoloads
empv-autoloads yasnippet-snippets-autoloads marginalia-autoloads
vertico-truncate-autoloads vertico-posframe-autoloads vertico-autoloads
lsp-uniteai-autoloads nix-ts-mode-autoloads go-translate-autoloads
alert-autoloads gntp-autoloads sdcv-autoloads telega-autoloads
tab-line-nerd-icons-autoloads keycast-autoloads rust-mode-autoloads
cargo-autoloads toml-autoloads rg-autoloads writeroom-mode-autoloads
nov-autoloads esxml-autoloads kv-autoloads ultra-scroll-autoloads
pdf-tools-autoloads org-sliced-images-autoloads
consult-org-roam-autoloads org-roam-autoloads org-journal-autoloads
org-download-autoloads org-modern-autoloads orderless-autoloads
mu4e-autoloads cyphejor-autoloads rfc-mode-autoloads
string-inflection-autoloads webpaste-autoloads systemd-autoloads
minuet-autoloads pr-review-autoloads forge-autoloads closql-autoloads
emacsql-autoloads ghub-autoloads treepy-autoloads lsp-java-autoloads
dap-mode-autoloads bui-autoloads lsp-treemacs-autoloads
lsp-docker-autoloads yaml-autoloads lsp-pyright-autoloads
consult-lsp-autoloads lsp-ui-autoloads lsp-mode-autoloads
groovy-mode-autoloads imenu-list-autoloads hungry-delete-autoloads
hide-comnt-autoloads minibuffer-header-autoloads gptel-quick-autoloads
gptel-autoloads gotest-autoloads fzf-autoloads
flycheck-golangci-lint-autoloads flycheck-clj-kondo-autoloads
pos-tip-autoloads consult-flycheck-autoloads flycheck-rust-autoloads
flycheck-posframe-autoloads flycheck-autoloads evil-anzu-autoloads
anzu-autoloads engine-mode-autoloads ement-autoloads
taxy-magit-section-autoloads taxy-autoloads embark-consult-autoloads
embark-autoloads ellama-autoloads llm-autoloads
plz-event-source-autoloads plz-media-type-autoloads plz-autoloads
symex-autoloads tree-sitter-autoloads tsc-autoloads lispy-autoloads
iedit-autoloads swiper-autoloads ivy-autoloads zoutline-autoloads
evil-cleverparens-autoloads smartparens-autoloads combobulate-autoloads
combobulate-go combobulate-json combobulate-yaml combobulate-css
combobulate-js-ts combobulate-python combobulate-html combobulate-toml
combobulate-cursor multiple-cursors mc-separate-operations
rectangular-region-mode mc-mark-pop mc-edit-lines
mc-hide-unmatched-lines-mode mc-mark-more sgml-mode mc-cycle-cursors
multiple-cursors-core combobulate-query savehist evil-collection-scheme
scheme combobulate-ui combobulate-display combobulate-ztree
combobulate-envelope combobulate-manipulation evil-collection-python
python combobulate-procedure combobulate-navigation combobulate-misc
combobulate-setup tempo combobulate-interface combobulate-settings
combobulate-rules elisp-def-autoloads elfeed-tube-mpv-autoloads
elfeed-tube-autoloads elfeed-autoloads eee-autoloads
dired-git-info-autoloads dired-hacks-autoloads dired-preview-autoloads
diredfl-autoloads diff-hl-autoloads cmake-mode-autoloads
consult-yasnippet-autoloads yasnippet-capf-autoloads yasnippet-autoloads
cape-autoloads kind-icon-autoloads svg-lib-autoloads
corfu-terminal-autoloads popon-autoloads corfu-autoloads
copilot-autoloads copilot-chat-autoloads paredit-autoloads
clojure-ts-mode-autoloads cider-autoloads clojure-mode-autoloads
queue-autoloads spinner-autoloads sesman-autoloads
chatgpt-shell-autoloads shell-maker-autoloads breadcrumb-autoloads
bookmark-in-project-autoloads bookmark+-autoloads babashka-autoloads
parseedn-autoloads parseclj-autoloads aider-autoloads
mediawiki-autoloads markdown-mode-autoloads treemacs-magit-autoloads
magit-autoloads with-editor-autoloads nerd-icons-ibuffer-autoloads
treemacs-nerd-icons-autoloads treemacs-autoloads pfuture-autoloads
cfrs-autoloads cnfonts-autoloads burly-autoloads compile-multi-autoloads
form-feed-st-autoloads google-this-autoloads echo-bar-autoloads
zoom-autoloads fcitx-autoloads eat-autoloads vterm-autoloads
chatgpt-autoloads polymode-autoloads ox-reveal-autoloads
htmlize-autoloads wordreference-autoloads explain-pause-mode-autoloads
weather-metno-autoloads display-wttr-autoloads kdeconnect-autoloads
emms-autoloads crux-autoloads pest-mode-autoloads popwin-autoloads
modus-themes-autoloads blackboard-theme-autoloads
standard-themes-autoloads nimbus-theme-autoloads tok-theme-autoloads
danneskjold-theme-autoloads srcery-theme-autoloads
subatomic256-theme-autoloads iscroll-autoloads xml+-autoloads
multiple-cursors-autoloads evil-textobj-tree-sitter-autoloads
evil-numbers-autoloads ctable-autoloads line-reminder-autoloads
fringe-helper-autoloads ov-autoloads solarized-theme-autoloads
sqlup-mode-autoloads bm-autoloads zen-mode-autoloads sly-autoloads
expand-region-autoloads highlight-defined-autoloads
base16-theme-autoloads idea-darkula-theme-autoloads
hybrid-reverse-theme-autoloads material-theme-autoloads
doom-themes-autoloads nyan-mode-autoloads organic-green-theme-autoloads
inkpot-theme-autoloads github-dark-vscode-theme-autoloads
almost-mono-themes-autoloads cyberpunk-theme-autoloads
soothe-theme-autoloads zenburn-theme-autoloads mindre-theme-autoloads
kaolin-themes-autoloads tron-legacy-theme-autoloads
wildcharm-theme-autoloads atom-one-dark-theme-autoloads
parchment-theme-autoloads autothemer-autoloads
visual-fill-column-autoloads transpose-frame-autoloads
gameoflife-autoloads docker-autoloads dockerfile-mode-autoloads
emacs-everywhere-autoloads cus-dir-autoloads makefile-executor-autoloads
dumb-jump-autoloads popup-autoloads bing-dict-autoloads
hl-todo-autoloads atom-dark-theme-autoloads ef-themes-autoloads
uwu-theme-autoloads vagrant-autoloads ag-autoloads alarm-clock-autoloads
pinentry-autoloads hackernews-autoloads notmuch-autoloads
fussy-autoloads flx-autoloads affe-autoloads consult-autoloads
clang-format-autoloads apheleia-autoloads elisp-autofmt-autoloads
vimrc-mode-autoloads mpv-autoloads gnuplot-autoloads
mermaid-mode-autoloads atomic-chrome-autoloads websocket-autoloads
restore-point-autoloads ace-window-autoloads avy-autoloads
olivetti-autoloads super-save-autoloads helpful-autoloads
elisp-refs-autoloads solidity-mode-autoloads git-timemachine-autoloads
web-mode-autoloads adoc-mode-autoloads go-mode-autoloads
js2-mode-autoloads rust-playground-autoloads evil-collection-which-key
which-key super-hint-xref super-hint-rg super-hint evil-collection-xref
xref evil-collection-rg rg piper ob-shell ob-gnuplot ob-C
evil-collection-org org ob ob-tangle ob-ref ob-lob ob-table ob-exp
org-macro org-src evil-collection-sh-script sh-script executable
ob-comint org-pcomplete org-list org-footnote org-faces org-entities
org-version ob-emacs-lisp ob-core ob-eval org-cycle org-table ol
org-fold org-fold-core org-keys oc org-loaddefs org-compat org-macs
molecule-mode lsp hyperbole gptel-manual-complete evil-collection-gptel
gptel windmove erc erc-backend erc-networks erc-common erc-compat
erc-loaddefs evil-collection-ediff ediff ediff-merg ediff-mult
ediff-wind ediff-diff ediff-help ediff-init ediff-util dired-x
consult-ripgrep-all server evil-collection-eww eww vtable mule-util
url-queue epa-file evil-collection-epa epa epg rfc6068 epg-config
saveplace recentf tree-widget winner edit-list refine loop list-utils
evil-collection-leetcode leetcode derived log4e aio mm-url
evil-collection-gnus gnus nnheader gnus-util range let-alist prompts
file-info browse-at-remote f image-roll evil-collection-image image-mode
exif toc-mode rst scratch sql evil-collection-view view
persistent-scratch exercism persist async-await iter2 generator promise
url-http url-auth mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums
mail-prsvr url-gw nsm promise-rejection-tracking promise-finally
promise-done promise-es6-extensions promise-core async request
mailheader mail-utils a indent-bars evil-collection-outline noutline
outline mode-line-bell powerthesaurus jeison dash s
evil-collection-ripgrep ripgrep evil-collection-wgrep wgrep
evil-collection-grep grep evil-collection-vlf vlf vlf-base vlf-tune
gptai ctrlf hl-line nerd-icons-completion nerd-icons nerd-icons-faces
nerd-icons-data nerd-icons-data-mdicon nerd-icons-data-flicon
nerd-icons-data-codicon nerd-icons-data-devicon nerd-icons-data-sucicon
nerd-icons-data-wicon nerd-icons-data-faicon nerd-icons-data-powerline
nerd-icons-data-octicon nerd-icons-data-pomicon nerd-icons-data-ipsicon
disable-mouse mingus libmpdee evil-collection-mpdel mpdel mpdel-browser
libmpdel-directory mpdel-playlist mpdel-tablist mpdel-song mpdel-core
navigel evil-collection-bookmark bookmark evil-collection-tablist
tablist tablist-filter semantic/wisent/comp semantic/wisent
semantic/wisent/wisent semantic/util-modes semantic/util semantic
semantic/tag semantic/lex semantic/fw mode-local find-func cedet
libmpdel tq time-stamp posframe esup esup-child benchmark
ssh-config-mode jq-mode json-mode json-snatcher js c-ts-common treesit
evil-collection-imenu imenu cc-mode cc-fonts cc-guess cc-menus cc-cmds
cc-styles cc-align cc-engine cc-vars cc-defs evil-collection-yaml-mode
yaml-mode toml-mode conf-mode align highlight facemenu nix-mode ffap
smie nix-repl nix-shell nix-store evil-collection-magit-section
magit-section cursor-sensor llama nix-log nix-instantiate nix-shebang
nix-format nix sudo-edit tramp trampver tramp-integration tramp-message
tramp-compat shell pcomplete parse-time iso8601 time-date tramp-loaddefs
evil-collection-devdocs devdocs mathjax evil-terminal-cursor-changer
evil-visualstar evil-commentary evil-commentary-integration
evil-collection-evil-mc evil-mc evil-mc-command-execute
evil-mc-command-record evil-mc-cursor-make evil-mc-region
evil-mc-cursor-state evil-mc-undo evil-mc-vars evil-mc-known-commands
evil-mc-common evil-exchange evil-lion evil-args smartscan timeout ess
ess-utils ess-custom evil-collection-unimpaired evil-collection-vc-git
evil-collection-tabulated-list evil-collection-tab-bar
evil-collection-simple evil-collection-replace
evil-collection-process-menu evil-collection-package-menu
evil-collection-minibuffer evil-collection-man evil-collection-kmacro
evil-collection-indent evil-collection-help evil-collection-flymake
evil-collection-elisp-mode evil-collection-eldoc evil-collection-elpaca
evil-collection-dired evil-collection-diff-mode evil-collection-custom
evil-collection-compile evil-collection-comint evil-collection-calendar
evil-collection-buff-menu evil-collection annalist sqlite3 sqlite3-api
treebundel vc-git diff-mode track-changes files-x git-link dired
dired-loaddefs texfrag face-remap shr pixel-fill kinsoku url-file puny
svg dom preview latex latex-flymake flymake project compile
text-property-search comint ansi-osc tex-ispell tex-style tex dbus xml
crm texmathp auctex display-line-numbers elec-pair lisp-mnt package
browse-url xdg url-handlers xterm-color edit-list-autoloads
refine-autoloads list-utils-autoloads loop-autoloads leetcode-autoloads
aio-autoloads log4e-autoloads prompts-autoloads file-info-autoloads
hydra-autoloads lv-autoloads browse-at-remote-autoloads
image-roll-autoloads saveplace-pdf-view-autoloads pdfgrep-autoloads
toc-mode-autoloads scratch-autoloads persistent-scratch-autoloads
exercism-autoloads a-autoloads request-autoloads async-autoloads
async-await-autoloads promise-autoloads iter2-autoloads
persist-autoloads indent-bars-autoloads rainbow-delimiters-autoloads
rainbow-mode-autoloads mode-line-bell-autoloads powerthesaurus-autoloads
hydra lv jeison-autoloads ripgrep-autoloads wgrep-autoloads
vlf-autoloads gptai-autoloads popper-autoloads ctrlf-autoloads
nerd-icons-dired-autoloads nerd-icons-completion-autoloads
nerd-icons-autoloads disable-mouse-autoloads mingus-autoloads
libmpdee-autoloads mpdel-autoloads libmpdel-autoloads navigel-autoloads
tablist-autoloads posframe-autoloads esup-autoloads quickrun-autoloads
ht-autoloads ssh-config-mode-autoloads jq-mode-autoloads
json-mode-autoloads json-snatcher-autoloads yaml-mode-autoloads
toml-mode-autoloads symbol-overlay-autoloads
highlight-escape-sequences-autoloads highlight-autoloads
highlight-numbers-autoloads parent-mode-autoloads nix-mode-autoloads
magit-section-autoloads llama-autoloads sudo-edit-autoloads
attrap-autoloads f-autoloads dash-autoloads s-autoloads
devdocs-autoloads mathjax-autoloads
evil-terminal-cursor-changer-autoloads evil-surround-autoloads
evil-visualstar-autoloads evil-commentary-autoloads evil-mc-autoloads
evil-exchange-autoloads evil-lion-autoloads evil-args-autoloads
smartscan-autoloads timeout-autoloads ess-autoloads
info-colors-autoloads el-patch-autoloads el-patch el-patch-stub
evil-collection-autoloads annalist-autoloads sqlite3-autoloads
treebundel-autoloads git-link-autoloads texfrag-autoloads
auctex-autoloads tex-site xterm-color-autoloads ispell man ansi-color
autorevert filenotify cal-menu calendar cal-loaddefs advice evil
evil-integration evil-maps evil-commands reveal evil-jumps
evil-command-window evil-types evil-search evil-ex evil-macros
evil-repeat evil-states evil-core comp comp-cstr comp-run comp-common rx
evil-common thingatpt rect evil-vars ring undo-fu goto-chg
evil-autoloads undo-fu-autoloads goto-chg-autoloads transient pcase
format-spec transient-autoloads general memoize
sanityinc-tomorrow-bright-theme color-theme-sanityinc-tomorrow color
minions compat general-autoloads memoize-autoloads
color-theme-sanityinc-tomorrow-autoloads minions-autoloads edmacro
kmacro vc vc-dispatcher cl-extra help-mode elpaca-use-package
use-package use-package-ensure use-package-delight use-package-diminish
use-package-bind-key bind-key easy-mmode use-package-core
elpaca-use-package-autoloads elpaca-log elpaca-ui elpaca-menu-elpa
elpaca-menu-melpa url url-proxy url-privacy url-expand url-methods
url-history url-cookie generate-lisp-file url-domsuf url-util url-parse
auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x
map byte-opt gv bytecomp byte-compile url-vars mailcap elpaca-menu-org
elpaca warnings elpaca-process elpaca-autoloads early-init cus-edit pp
cus-load icons wid-edit cl-loaddefs cl-lib rmc iso-transl tooltip cconv
eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode mwheel term/pgtk-win pgtk-win term/common-win touch-screen
pgtk-dnd 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 gtk pgtk lcms2 multi-tty move-toolbar
make-network-process tty-child-frames native-compile emacs)

Memory information:
((conses 16 3621582 18472292) (symbols 48 157613 5456)
  (strings 32 893710 403795) (string-bytes 1 27370804) (vectors 16 260241)
  (vector-slots 8 3936524 5289091) (floats 8 4305 26791)
  (intervals 56 73808 42187) (buffers 992 149))

-- 




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 14:29:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eval Exec <execvy <at> gmail.com>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 16:27:44 +0200
> From: Eval Exec <execvy <at> gmail.com>
> Date: Thu, 27 Feb 2025 21:55:40 +0800
> 
> I a 0.1 s repeat timer in emacs -Q, then Emacs's the cpu usage is 30% ~
> 70%.
> I think it's a bug.

I get around 45% with this, but why do you consider this a bug?  Your
timer function perhaps does nothing, but the timer machinery is
invoked every 100 msec, and it does consume CPU.

in addition, when you have a high-frequency timer, the Emacs idle loop
is much more expensive, because instead of waiting inside pselect, it
runs all the loop code every 100 msec.

Maybe I'm missing something, but I don't see a bug here.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 14:40:13 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 22:34:44 +0800
45% CPU for a 0.1s repeating timer does seem surprisingly high. Is
there a way we can optimize this, given the frequent timer
invocations?

On Thu, Feb 27, 2025 at 10:27 PM Eli Zaretskii <eliz <at> gnu.org> wrote:
>
> > From: Eval Exec <execvy <at> gmail.com>
> > Date: Thu, 27 Feb 2025 21:55:40 +0800
> >
> > I a 0.1 s repeat timer in emacs -Q, then Emacs's the cpu usage is 30% ~
> > 70%.
> > I think it's a bug.
>
> I get around 45% with this, but why do you consider this a bug?  Your
> timer function perhaps does nothing, but the timer machinery is
> invoked every 100 msec, and it does consume CPU.
>
> in addition, when you have a high-frequency timer, the Emacs idle loop
> is much more expensive, because instead of waiting inside pselect, it
> runs all the loop code every 100 msec.
>
> Maybe I'm missing something, but I don't see a bug here.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 14:40:16 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 22:38:35 +0800
Compare to a bash script:
while true; do
  sleep 0.1;
   date
done

above script have 0% CPU usage on my laptop.

change it to 0.0001:
while true; do
  sleep 0.0001;
   date
done

even 0.0001 s repeat, the bash script only have 4% cpu usage.

So I think a 0.1s repeat timer in Emacs consume 45% is very surprise.
I think maybe we should improve the timer performance

On Thu, Feb 27, 2025 at 10:34 PM Eval Exec <execvy <at> gmail.com> wrote:
>
> 45% CPU for a 0.1s repeating timer does seem surprisingly high. Is
> there a way we can optimize this, given the frequent timer
> invocations?
>
> On Thu, Feb 27, 2025 at 10:27 PM Eli Zaretskii <eliz <at> gnu.org> wrote:
> >
> > > From: Eval Exec <execvy <at> gmail.com>
> > > Date: Thu, 27 Feb 2025 21:55:40 +0800
> > >
> > > I a 0.1 s repeat timer in emacs -Q, then Emacs's the cpu usage is 30% ~
> > > 70%.
> > > I think it's a bug.
> >
> > I get around 45% with this, but why do you consider this a bug?  Your
> > timer function perhaps does nothing, but the timer machinery is
> > invoked every 100 msec, and it does consume CPU.
> >
> > in addition, when you have a high-frequency timer, the Emacs idle loop
> > is much more expensive, because instead of waiting inside pselect, it
> > runs all the loop code every 100 msec.
> >
> > Maybe I'm missing something, but I don't see a bug here.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:06:01 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 23:05:03 +0800
I created test.el:
(defun exec/emacs-lisp-machine-update()
  ;; do nothing
)
(progn
  (defvar exec/emacs-lisp-machine-timer nil)
  (when (timerp exec/emacs-lisp-machine-timer)
  (cancel-timer exec/emacs-lisp-machine-timer))
  (setq exec/emacs-lisp-machine-timer
  (run-with-timer 0.0 0.00001 'exec/emacs-lisp-machine-update))
)

then build emacs with --enable-profiling, then :

./bin/emacs -Q -l test.el

will get a gmon.out file, then I found:

❯ gprof ./bin/emacs gmon.out
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  Ts/call  Ts/call  name
 48.00      0.84     0.84
process_mark_stack.lto_priv.0
  5.71      0.94     0.10                             mark_char_table
  4.00      1.01     0.07                             bidi_resolve_explicit
  2.86      1.06     0.05                             gui_produce_glyphs
  2.29      1.10     0.04
face_before_or_after_it_pos.lto_priv.0
  1.71      1.13     0.03                             Ffuncall
  1.71      1.16     0.03
move_it_in_display_line_to.constprop.1
  1.14      1.18     0.02                             Fassq
  1.14      1.20     0.02                             Fcommand_modes
  1.14      1.22     0.02                             bidi_level_of_next_char
  1.14      1.24     0.02                             bidi_move_to_visually_next
  1.14      1.26     0.02                             bidi_resolve_neutral
  1.14      1.28     0.02                             find_interval
  1.14      1.30     0.02                             ftcrfont_close.lto_priv.0
  1.14      1.32     0.02                             funcall_general
  1.14      1.34     0.02                             set_buffer_internal_2
  0.57      1.35     0.01                             Fcons
  0.57      1.36     0.01                             Fminus
  0.57      1.37     0.01
Fnext_single_property_change
  0.57      1.38     0.01                             _init
  0.57      1.39     0.01                             assq_no_quit
  0.57      1.40     0.01                             bidi_cache_iterator_state
  0.57      1.41     0.01
bidi_cache_search.constprop.0
  0.57      1.42     0.01                             bidi_explicit_dir_char
  0.57      1.43     0.01                             bidi_fetch_char
  0.57      1.44     0.01
composition_compute_stop_pos
  0.57      1.45     0.01
compute_line_metrics.lto_priv.0
  0.57      1.46     0.01                             display_line.lto_priv.0
  0.57      1.47     0.01                             do_symval_forwarding
  0.57      1.48     0.01                             face_for_char
  0.57      1.49     0.01                             fill_glyph_string
  0.57      1.50     0.01                             fix_position
  0.57      1.51     0.01
ftcrfont_encode_char.lto_priv.0
  0.57      1.52     0.01                             ftcrfont_glyph_extents
  0.57      1.53     0.01                             get_keyelt.constprop.0
  0.57      1.54     0.01
get_lface_attributes.lto_priv.0
  0.57      1.55     0.01                             indirect_function
  0.57      1.56     0.01
internal_equal_1.lto_priv.0
  0.57      1.57     0.01                             make_interval
  0.57      1.58     0.01
map_sub_char_table.lto_priv.0
  0.57      1.59     0.01
mark_stack_push_value.lto_priv.0
  0.57      1.60     0.01
mark_window_display_accurate_1
  0.57      1.61     0.01                             pgtk_set_glyph_string_gc
  0.57      1.62     0.01
pgtk_window_is_of_frame_recursive.lto_priv.0
  0.57      1.63     0.01                             plist_get
  0.57      1.64     0.01
produce_special_glyphs.lto_priv.0
  0.57      1.65     0.01
set_cursor_from_row.lto_priv.0
  0.57      1.66     0.01
set_iterator_to_next.lto_priv.0
  0.57      1.67     0.01                             specbind
  0.57      1.68     0.01                             start_display
  0.57      1.69     0.01                             substring_both
  0.57      1.70     0.01
swap_in_symval_forwarding.lto_priv.0
  0.57      1.71     0.01                             sweep_strings.lto_priv.0
  0.57      1.72     0.01                             sweep_vectors.lto_priv.0
  0.57      1.73     0.01                             time_arith.lto_priv.0
  0.57      1.74     0.01
traverse_intervals.constprop.0
  0.57      1.75     0.01                             unbind_to.constprop.0

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.

 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
           else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this
           function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
           the function in the gprof listing. If the index is
           in parenthesis it shows where it would appear in
           the gprof listing if it were to be printed.


Copyright (C) 2012-2024 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.

On Thu, Feb 27, 2025 at 10:38 PM Eval Exec <execvy <at> gmail.com> wrote:
>
> Compare to a bash script:
> while true; do
>   sleep 0.1;
>    date
> done
>
> above script have 0% CPU usage on my laptop.
>
> change it to 0.0001:
> while true; do
>   sleep 0.0001;
>    date
> done
>
> even 0.0001 s repeat, the bash script only have 4% cpu usage.
>
> So I think a 0.1s repeat timer in Emacs consume 45% is very surprise.
> I think maybe we should improve the timer performance
>
> On Thu, Feb 27, 2025 at 10:34 PM Eval Exec <execvy <at> gmail.com> wrote:
> >
> > 45% CPU for a 0.1s repeating timer does seem surprisingly high. Is
> > there a way we can optimize this, given the frequent timer
> > invocations?
> >
> > On Thu, Feb 27, 2025 at 10:27 PM Eli Zaretskii <eliz <at> gnu.org> wrote:
> > >
> > > > From: Eval Exec <execvy <at> gmail.com>
> > > > Date: Thu, 27 Feb 2025 21:55:40 +0800
> > > >
> > > > I a 0.1 s repeat timer in emacs -Q, then Emacs's the cpu usage is 30% ~
> > > > 70%.
> > > > I think it's a bug.
> > >
> > > I get around 45% with this, but why do you consider this a bug?  Your
> > > timer function perhaps does nothing, but the timer machinery is
> > > invoked every 100 msec, and it does consume CPU.
> > >
> > > in addition, when you have a high-frequency timer, the Emacs idle loop
> > > is much more expensive, because instead of waiting inside pselect, it
> > > runs all the loop code every 100 msec.
> > >
> > > Maybe I'm missing something, but I don't see a bug here.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:06:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eval Exec <execvy <at> gmail.com>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 17:05:11 +0200
> From: Eval Exec <execvy <at> gmail.com>
> Date: Thu, 27 Feb 2025 22:34:44 +0800
> Cc: 76609 <at> debbugs.gnu.org
> 
> 45% CPU for a 0.1s repeating timer does seem surprisingly high. Is
> there a way we can optimize this, given the frequent timer
> invocations?

We already optimize that as much as we can, AFAIK.

What timers really need to run 10 times a second?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:08:01 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eval Exec <execvy <at> gmail.com>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 17:07:07 +0200
> From: Eval Exec <execvy <at> gmail.com>
> Date: Thu, 27 Feb 2025 22:38:35 +0800
> Cc: 76609 <at> debbugs.gnu.org
> 
> Compare to a bash script:
> while true; do
>   sleep 0.1;
>    date
> done
> 
> above script have 0% CPU usage on my laptop.
> 
> change it to 0.0001:
> while true; do
>   sleep 0.0001;
>    date
> done
> 
> even 0.0001 s repeat, the bash script only have 4% cpu usage.
> 
> So I think a 0.1s repeat timer in Emacs consume 45% is very surprise.
> I think maybe we should improve the timer performance

This is not a serious argument, sorry.  Look at the code Emacs runs in
its idle loop, and you will understand how invalid is any comparison
with a shell script which does little except sleeping for 0.1 sec.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:11:02 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 23:10:35 +0800
[Message part 1 (text/plain, inline)]
> What timers really need to run 10 times a second?

I'd like to create a timer to dynamically update the tab bar, similar to
the effect shown in this video: [https://imgur.com/a/2QAtDQC].

Could you suggest some efficient ways to achieve this?

On Thu, Feb 27, 2025 at 11:05 PM Eli Zaretskii <eliz <at> gnu.org> wrote:

> > From: Eval Exec <execvy <at> gmail.com>
> > Date: Thu, 27 Feb 2025 22:34:44 +0800
> > Cc: 76609 <at> debbugs.gnu.org
> >
> > 45% CPU for a 0.1s repeating timer does seem surprisingly high. Is
> > there a way we can optimize this, given the frequent timer
> > invocations?
>
> We already optimize that as much as we can, AFAIK.
>
> What timers really need to run 10 times a second?
>
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:15:01 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 23:13:44 +0800
[Message part 1 (text/plain, inline)]
> Look at the code Emacs runs in its idle loop

Could you please guide me where is the idle loop related code in emacs
source repo? which file and which lines ranges.
Thank you.

On Thu, Feb 27, 2025 at 11:07 PM Eli Zaretskii <eliz <at> gnu.org> wrote:

> > From: Eval Exec <execvy <at> gmail.com>
> > Date: Thu, 27 Feb 2025 22:38:35 +0800
> > Cc: 76609 <at> debbugs.gnu.org
> >
> > Compare to a bash script:
> > while true; do
> >   sleep 0.1;
> >    date
> > done
> >
> > above script have 0% CPU usage on my laptop.
> >
> > change it to 0.0001:
> > while true; do
> >   sleep 0.0001;
> >    date
> > done
> >
> > even 0.0001 s repeat, the bash script only have 4% cpu usage.
> >
> > So I think a 0.1s repeat timer in Emacs consume 45% is very surprise.
> > I think maybe we should improve the timer performance
>
> This is not a serious argument, sorry.  Look at the code Emacs runs in
> its idle loop, and you will understand how invalid is any comparison
> with a shell script which does little except sleeping for 0.1 sec.
>
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:32:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eval Exec <execvy <at> gmail.com>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 17:30:58 +0200
> From: Eval Exec <execvy <at> gmail.com>
> Date: Thu, 27 Feb 2025 23:13:44 +0800
> Cc: 76609 <at> debbugs.gnu.org
> 
> > Look at the code Emacs runs in its idle loop
> 
> Could you please guide me where is the idle loop related code in emacs source repo? which file and which
> lines ranges.

It's in keyboard.c, in the function read_char.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:38:04 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eval Exec <execvy <at> gmail.com>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 17:37:33 +0200
> From: Eval Exec <execvy <at> gmail.com>
> Date: Thu, 27 Feb 2025 23:10:35 +0800
> Cc: 76609 <at> debbugs.gnu.org
> 
> > What timers really need to run 10 times a second?
> 
> I'd like to create a timer to dynamically update the tab bar, similar to the effect shown in this video:
> [https://imgur.com/a/2QAtDQC]. 

Then why are you worried by the CPU usage?  This is similar to
performing redisplay of a portion of a window because the user presses
keys at 10 Hz rate.  If I press and hold the <RIGHT> arrow, I get
similar CPU usage (my keyboard auto-repeat rate is about 50/sec).
Each <RIGHT> keypress causes Emacs to draw 2 characters: the one from
which the cursor moves and the one to which it moves.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 15:45:02 GMT) Full text and rfc822 format available.

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

From: Eval Exec <execvy <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 23:44:16 +0800
[Message part 1 (text/plain, inline)]
> Then why are you worried by the CPU usage?
Because I use laptop with battery everyday, I want to let Emacs more
powersave. Get a better battery life.



On Thu, Feb 27, 2025 at 11:37 PM Eli Zaretskii <eliz <at> gnu.org> wrote:

> > From: Eval Exec <execvy <at> gmail.com>
> > Date: Thu, 27 Feb 2025 23:10:35 +0800
> > Cc: 76609 <at> debbugs.gnu.org
> >
> > > What timers really need to run 10 times a second?
> >
> > I'd like to create a timer to dynamically update the tab bar, similar to
> the effect shown in this video:
> > [https://imgur.com/a/2QAtDQC].
>
> Then why are you worried by the CPU usage?  This is similar to
> performing redisplay of a portion of a window because the user presses
> keys at 10 Hz rate.  If I press and hold the <RIGHT> arrow, I get
> similar CPU usage (my keyboard auto-repeat rate is about 50/sec).
> Each <RIGHT> keypress causes Emacs to draw 2 characters: the one from
> which the cursor moves and the one to which it moves.
>
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76609; Package emacs. (Thu, 27 Feb 2025 16:47:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eval Exec <execvy <at> gmail.com>
Cc: 76609 <at> debbugs.gnu.org
Subject: Re: bug#76609: 31.0.50; The 0.1s repeat timer is very CPU-intensive; 
 it might be a bug?
Date: Thu, 27 Feb 2025 18:46:05 +0200
> From: Eval Exec <execvy <at> gmail.com>
> Date: Thu, 27 Feb 2025 23:44:16 +0800
> Cc: 76609 <at> debbugs.gnu.org
> 
> > Then why are you worried by the CPU usage?
> Because I use laptop with battery everyday, I want to let Emacs more powersave. Get a better battery life. 

Running a high-frequency timer with non-trivial processing is
incompatible with saving battery.  This is why any significant
processing in an otherwise idle Emacs is considered a misfeature.

So users who want to save battery should be advised not to turn on
features such as the one you want to provide, because in Emacs moving
text on display at high frequency is not cheap, even without the
processing done for high-frequency timers.




This bug report was last modified 107 days ago.

Previous Next


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