Skip to content

Commit

Permalink
perf(tabs): rate limit centaur-tabs-buffer-update-groups
Browse files Browse the repository at this point in the history
`centaur-tabs-buffer-update-groups` walks every buffer to determine the
group it belongs to. This function can be called execessively (upwards
of 1,000 times per second in certain conditions), as it is called on
every redisplay (it is indirectly attached to `tab-line-format`). This
rate limits its calls to about 10 per second.

Close: doomemacs#7792
Ref: ema2159/centaur-tabs#222
  • Loading branch information
gpanago authored and hlissner committed Apr 6, 2024
1 parent 4f07e83 commit 813c961
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion modules/ui/tabs/config.el
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
;;; ui/tabs/config.el -*- lexical-binding: t; -*-

(defcustom +tabs-buffer-update-groups-delay 0.1
"Minimum wait time (in seconds) before tab groups are recalculated."
:type 'float
:group 'doom)


;;
;;; Packages

(use-package! centaur-tabs
:hook (doom-first-file . centaur-tabs-mode)
:init
Expand All @@ -20,7 +29,20 @@
(defun +tabs-disable-centaur-tabs-mode-maybe-h ()
"Disable `centaur-tabs-mode' in current buffer."
(when (centaur-tabs-mode-on-p)
(centaur-tabs-local-mode)))))
(centaur-tabs-local-mode))))

;; HACK: `centaur-tabs-buffer-update-groups' is both expensive and called too
;; frequently. There really is no reason to call it more than 10 times per
;; second, as buffers rarely change groups more frequently than that.
(let ((time (float-time)))
(defadvice! +tabs--rate-limit-buffer-update-groups-a (fn)
:around #'centaur-tabs-buffer-update-groups
(let ((now (float-time)))
(if-let ((buf (and (< now (+ time +tabs-buffer-update-groups-delay))
(assq (current-buffer) centaur-tabs--buffers))))
(car (nth 2 buf))
(setq time now)
(funcall fn))))))


;; TODO tab-bar-mode (emacs 27)
Expand Down

0 comments on commit 813c961

Please sign in to comment.