perf(lib): minor optimizations

To reduce allocations in hot loops.
This commit is contained in:
Henrik Lissner 2024-09-07 18:03:14 -04:00
parent 0d9e188b26
commit 6025e141aa
No known key found for this signature in database
GPG key ID: B60957CA074D39A3
2 changed files with 25 additions and 19 deletions

View file

@ -91,12 +91,12 @@ If no project is active, return all buffers."
;;;###autoload ;;;###autoload
(defun doom-special-buffer-p (buf) (defun doom-special-buffer-p (buf)
"Returns non-nil if BUF's name starts and ends with an *." "Returns non-nil if BUF's name starts and ends with an *."
(equal (substring (buffer-name buf) 0 1) "*")) (char-equal ?* (aref (buffer-name buf) 0)))
;;;###autoload ;;;###autoload
(defun doom-temp-buffer-p (buf) (defun doom-temp-buffer-p (buf)
"Returns non-nil if BUF is temporary." "Returns non-nil if BUF is temporary."
(equal (substring (buffer-name buf) 0 1) " ")) (char-equal ?\s (aref (buffer-name buf) 0)))
;;;###autoload ;;;###autoload
(defun doom-visible-buffer-p (buf) (defun doom-visible-buffer-p (buf)
@ -111,12 +111,14 @@ If no project is active, return all buffers."
;;;###autoload ;;;###autoload
(defun doom-non-file-visiting-buffer-p (buf) (defun doom-non-file-visiting-buffer-p (buf)
"Returns non-nil if BUF does not have a value for `buffer-file-name'." "Returns non-nil if BUF does not have a value for `buffer-file-name'."
(not (buffer-file-name buf))) (not (buffer-file-name (or (buffer-base-buffer buf) buf))))
;;;###autoload ;;;###autoload
(defun doom-real-buffer-list (&optional buffer-list) (defun doom-real-buffer-list (&optional buffer-list)
"Return a list of buffers that satisfy `doom-real-buffer-p'." "Return a list of buffers that satisfy `doom-real-buffer-p'."
(cl-remove-if-not #'doom-real-buffer-p (or buffer-list (doom-buffer-list)))) (cl-loop for buf in (or buffer-list (doom-buffer-list))
if (doom-real-buffer-p buf)
collect buf))
;;;###autoload ;;;###autoload
(defun doom-real-buffer-p (buffer-or-name) (defun doom-real-buffer-p (buffer-or-name)
@ -160,15 +162,13 @@ See `doom-real-buffer-p' for details on what that means."
"Return a list of buffers whose `major-mode' is `eq' to MODE(S). "Return a list of buffers whose `major-mode' is `eq' to MODE(S).
If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." If DERIVED-P, test with `derived-mode-p', otherwise use `eq'."
(let ((modes (ensure-list modes))) (cl-loop with modes = (ensure-list modes)
(cl-remove-if-not (if derived-p for buf in (or buffer-list (doom-buffer-list))
(lambda (buf) for mode = (buffer-local-value 'major-mode buf)
(apply #'provided-mode-derived-p if (if derived-p
(buffer-local-value 'major-mode buf) (apply #'provided-mode-derived-p mode modes)
modes)) (memq mode modes))
(lambda (buf) collect buf))
(memq (buffer-local-value 'major-mode buf) modes)))
(or buffer-list (doom-buffer-list)))))
;;;###autoload ;;;###autoload
(defun doom-visible-windows (&optional window-list) (defun doom-visible-windows (&optional window-list)
@ -187,20 +187,23 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'."
if (window-list frame) if (window-list frame)
nconc (mapcar #'window-buffer it))))) nconc (mapcar #'window-buffer it)))))
(if buffer-list (if buffer-list
(cl-delete-if (lambda (b) (memq b buffer-list)) (cl-loop for buf in buffers
buffers) unless (memq buf buffer-list)
(delete-dups buffers)))) collect buffers)
buffers)))
;;;###autoload ;;;###autoload
(defun doom-buried-buffers (&optional buffer-list) (defun doom-buried-buffers (&optional buffer-list)
"Get a list of buffers that are buried." "Get a list of buffers that are buried."
(cl-remove-if #'get-buffer-window (or buffer-list (doom-buffer-list)))) (cl-loop for buf in (or buffer-list (doom-buffer-list))
unless (doom-visible-buffer-p buf)
collect buf))
;;;###autoload ;;;###autoload
(defun doom-matching-buffers (pattern &optional buffer-list) (defun doom-matching-buffers (pattern &optional buffer-list)
"Get a list of all buffers that match the regex PATTERN." "Get a list of all buffers that match the regex PATTERN."
(cl-loop for buf in (or buffer-list (doom-buffer-list)) (cl-loop for buf in (or buffer-list (doom-buffer-list))
when (string-match-p pattern (buffer-name buf)) if (string-match-p pattern (buffer-name buf))
collect buf)) collect buf))
;;;###autoload ;;;###autoload

View file

@ -45,6 +45,7 @@ This is used by `file-exists-p!' and `project-file-exists-p!'."
Ignores `nil' elements in SEGMENTS, and is intended as a fast compromise between Ignores `nil' elements in SEGMENTS, and is intended as a fast compromise between
`expand-file-name' (slow, but accurate), `file-name-concat' (fast, but `expand-file-name' (slow, but accurate), `file-name-concat' (fast, but
inaccurate)." inaccurate)."
(declare (side-effect-free t))
;; PERF: An empty `file-name-handler-alist' = faster `expand-file-name'. ;; PERF: An empty `file-name-handler-alist' = faster `expand-file-name'.
(let (file-name-handler-alist) (let (file-name-handler-alist)
(expand-file-name (expand-file-name
@ -69,7 +70,9 @@ If the glob ends in a slash, only returns matching directories."
file-name-handler-alist file-name-handler-alist
(path (apply #'file-name-concat segments))) (path (apply #'file-name-concat segments)))
(if (string-suffix-p "/" path) (if (string-suffix-p "/" path)
(cl-delete-if-not #'file-directory-p (file-expand-wildcards (substring path 0 -1))) (cl-loop for file in (file-expand-wildcards (substring path 0 -1))
if (file-directory-p file)
collect file)
(file-expand-wildcards path)))) (file-expand-wildcards path))))
;;;###autoload ;;;###autoload