From 4bba7122f3eec6370add26fdf37ab2c838121509 Mon Sep 17 00:00:00 2001 From: Nikolai Shields Date: Mon, 21 Oct 2024 23:53:50 -0500 Subject: [PATCH] Add performance optimizations - monitoring startup and gc times - IO, file ops, and rendering --- config.org | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 156f080..5ea6cd9 100644 --- a/config.org +++ b/config.org @@ -26,8 +26,6 @@ This configuration needs to be loaded by =init.el=. Create an =init.el= with thi Early-init optimizations for faster Emacs startup. #+begin_src emacs-lisp -;; Garbage collection -(setq gc-cons-threshold 100000000) ; 100mb (setq read-process-output-max (* 1024 1024)) ; 1mb ;; Faster startup @@ -35,6 +33,129 @@ Early-init optimizations for faster Emacs startup. (setq site-run-file nil) #+end_src +** Garbage Collection +The garbage collector in Emacs can significantly impact performance. We can optimize it in several ways: + +#+begin_src emacs-lisp +;; Increase garbage collection threshold +;; Default is 800 kilobytes +(setq gc-cons-threshold 100000000) ; 100mb during initialization +(setq gc-cons-percentage 0.6) ; Default is 0.1 + +;; Reset garbage collection after initialization +(add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold 16777216 ; 16mb + gc-cons-percentage 0.1))) + +;; Collect garbage when Emacs is out of focus +(add-function :after after-focus-change-function + (lambda () + (unless (frame-focus-state) + (garbage-collect)))) +#+end_src + +** File Processing +Optimize how Emacs handles file operations and processes: + +#+begin_src emacs-lisp +;; Increase amount of data read from processes +(setq read-process-output-max (* 1024 1024)) ; 1mb + +;; File name handler optimization +(defvar default-file-name-handler-alist file-name-handler-alist) +(setq file-name-handler-alist nil) ; Remove handlers during startup + +;; Restore file name handlers after initialization +(add-hook 'emacs-startup-hook + (lambda () + (setq file-name-handler-alist default-file-name-handler-alist))) +#+end_src + +** Startup Optimizations +Disable unnecessary features during startup: + +#+begin_src emacs-lisp +;; Faster startup +(setq package-enable-at-startup nil) ; Don't load packages at startup +(setq site-run-file nil) ; Don't load site-wide runtime config +(setq frame-inhibit-implied-resize t) ; Don't resize frame during init + +;; Disable UI elements early +(push '(menu-bar-lines . 0) default-frame-alist) +(push '(tool-bar-lines . 0) default-frame-alist) +(push '(vertical-scroll-bars) default-frame-alist) + +;; Disable bidirectional text scanning for small performance boost +(setq-default bidi-paragraph-direction 'left-to-right) +(setq bidi-inhibit-bpa t) +#+end_src + +** Font Performance +Optimize font rendering: +#+begin_src emacs-lisp +;; Prevent font cache compaction during GC for potentially better performance +;; at the cost of higher memory usage +(setq inhibit-compacting-font-caches t) +;; Font rendering optimization +(setq use-default-font-for-symbols nil) +(when (functionp 'harfbuzz-font) + (setq harfbuzz-font t)) + +;; File operation optimization +(setq find-file-visit-truename nil) ; Don't resolve symlinks +(setq vc-follow-symlinks nil) ; Don't follow symlinks in version control +#+end_src + +** IO Performance +Optimize file system operations: + +#+begin_src emacs-lisp +;; Lock files (handle with care) +(setq create-lockfiles nil) ; Disable lock files completely +;; OR for more granular control: +(setq lock-file-name-transforms ; Store lock files elsewhere + `((".*" ,(concat user-emacs-directory "locks/") t))) + +;; Backup settings (safer alternative to disabling) +(setq backup-directory-alist ; Store backups in separate directory + `(("." . ,(concat user-emacs-directory "backups")))) +(setq backup-by-copying t) ; Always copy, don't rename +(setq delete-old-versions t) ; Clean up old backups +(setq kept-new-versions 6) ; Keep 6 newest versions +(setq kept-old-versions 2) ; Keep 2 oldest versions + +;; Auto-save optimization +(setq auto-save-list-file-prefix nil) ; Disable auto-save list +(setq auto-save-default t) ; Keep auto-save itself enabled +(setq auto-save-interval 1000) ; Increase operations between auto-saves +(setq auto-save-timeout 30) ; Increase idle time before auto-save + +;; Local variables handling +(setq enable-local-variables :safe) ; Only allow safe variables +(setq enable-dir-local-variables nil) ; Disable directory locals +(setq enable-local-eval nil) ; Disable local eval for security + +;; Display and rendering +(setq redisplay-skip-fontification-on-input t) ; Skip fontification during typing +(setq fast-but-imprecise-scrolling t) ; Faster scrolling +(setq jit-lock-defer-time 0.05) ; Tiny delay for better responsiveness + +#+end_src +** Monitoring Performance +Tools to help monitor Emacs performance: + +#+begin_src emacs-lisp +;; Profile emacs startup +(add-hook 'emacs-startup-hook + (lambda () + (message "*** Emacs loaded in %s with %d garbage collections." + (format "%.2f seconds" + (float-time + (time-subtract after-init-time before-init-time))) + gcs-done))) +#+end_src + * Basic UI Configuration Remove unnecessary UI elements and set basic preferences.