TL; DR У мене така величезна кількість пакунків, що це шкодить моєму часу запуску. Якщо ви не вірите, що це може бути так, читайте далі.
Час мого запуску Emacs зовсім невеликий. Я не використовую use-package
, я просто встановив тонни гачків і autoload
так, щоб майже весь код був відкладений. Насправді вся справа завантажується зазвичай менше ніж на півсекунди, незважаючи на те, що це здається шаленим безладом.
Однак з часом я помітив, що час мого запуску стає щонайменше повільніше, незрозуміло. Врешті-решт це дійшло до моменту, коли час запуску становить ≥ 1 секунду. Нарешті мені було достатньо, і я вкопався в корені проблеми. Зрештою я прокоментував весь свій ~/.emacs
файл і виявив, що час запуску все ще ≥ 1 секунда. Насправді він лише бривався ~ 0.2
секунди, іноді навіть менше. Потім я спробував emacs -q
і виявив, що час запуску - ~ 0.1
секунди.
Вивчивши цей розділ посібника Elisp, я з’ясував, чому emacs -q
настільки скорочує час запуску. Мабуть, emacs -q
заважає Emacs робити три речі при запуску:
- завантаження вашого файлу init
- завантаження вашого
default.el
файлу - дзвінок
package-initialize
Ми вже виключили мій файл init, оскільки коментувати весь мій файл ~/.emacs
майже нічого не робиться. Я не використовую default.el
файл, тому це також виключається. Що залишається package-initialize
винуватцем хіта на виставу.
Чому б package-initialize
зайняти стільки часу запуску? Це було перше питання, яке я задав собі. Хіба я не все завантажую автоматично? Ну так. Але що саме ця проблема.
Я знайшов цю публікацію, в якій пояснюється, що "активація" пакунків складається з читання файлів автозавантаження та встановлення шляхів завантаження. Це, очевидно, спричиняє штраф за введення / виведення, коли у вас є багато пакетів, оскільки у вас є багато файлів для автоматичного завантаження, які потрібно прочитати, і встановити багато шляхів. На жаль, без цього завдання управління автозавантаженнями потрапляє до рук користувача. Іншими словами, не дозволяючи package.el
сканувати файлову систему для автоматичного завантаження файлів і шляхів, я повинен був би керувати тим, що міг би бути виснажливим і схильним до помилок процесом.
Я вважаю за краще не йти цією дорогою. Наразі я маю 116 пакетів, 107 із них від ELPA, а 25 з них - це залежності. Я впевнений, що це колосальне число - це так сильно принижує мою ефективність. Але я перебуваю в неприємності, бо не хочу видаляти жоден із своїх пакетів.
Чи є такий засіб у такій ситуації, щоб повернути час моменту запуску блискавки?
Оновлення:
Ми почали новий потік на emacs-devel
список розсилки про деяких пластирів по Стефан Моньє (опис цих патчів тут ) , щоб вирішити цю проблему. Будь-хто бажає перевірити свої патчі та дати відгук.
Ще одне оновлення:
Схоже, що Стефан Моньє вже не цікавиться цим питанням, або він не отримує моїх повідомлень. Я схильний вірити колишньому, що добре, хоча я би вдячний за якусь відповідь від нього, якщо це так. У будь-якому разі, код, який він створив для цього питання, працює досить добре. Найновіші його виправлення можна знайти тут (для Emacs 25.3) та тут (для головного відділення Emacs).Я побачив хороші покращення часу моменту запуску завдяки його патчам, і я перебуваю в тій точці, коли мені комфортно моє час запуску, оскільки він максимально оптимізований, не відриваючи особливості моєї настройки. Я сподівався, що ці патчі в якийсь момент перейдуть на магістраль Emacs, але я здогадуюсь, що мені (або комусь іншому) доведеться зараз взяти за це факел, замість Стефана. У списку розсилки ми розійшлися щодо розподілу авторських прав та ліцензування. Мені спочатку було незручно це робити, але через деякі коментарі Річарда Столмана та інших, присвоєння авторських прав може бути не таким обмежуючим, як я вважав спочатку. Більше того, можливо, я можу зробити свої твори загальнодоступними, як альтернативу авторському призначенню.
У будь-якому випадку, дякую Стефану за патчі поки що! Сподіваюся, ви продовжите розвивати ці зміни, але якщо ні, то це нормально, і я можу продовжувати їх розвивати в якийсь момент. Я також дякую всім, хто запропонував розуміння та внесок у вирішення цього питання.
Ще одне оновлення:
Нічого собі, схоже, що ця функція нарешті висадилася і буде в Emacs 27. Дякую Стефану Моньє!
use-package
це шлях для цього.