Я добавил следующие две строки в начало моего init.el
:
(setq gc-cons-threshold (eval-when-compile (* 1024 1024 1024)))
(run-with-idle-timer 2 t (lambda () (garbage-collect)))
Это означает, что вместо сбора мусора каждые 800 КБ выделенной памяти, Emacs делает это в режиме ожидания, то есть когда пауза не беспокоит меня. (Он также собирается после выделения 1 ГБ памяти, но я не думаю, что это произойдет).
Это улучшило мое время запуска примерно на две трети. Теоретически, это также должно улучшить производительность в целом. Есть ли недостатки этого подхода?
gc-cons-threshold
более высокое значение, чем вы действительно хотите достичь в любой момент времени, потому что вы должны предполагать, что время от времени вы будете достигать этого значения (в конце концов, кто знает, сколько мусора может накопиться какой-то неожиданно-восторженной не праздной задачей). Я не вижу особой проблемы с запуском gc с таймером простоя, но я думаю, что установив порог для неактивного gc так высоко, как кажется OTT, и у меня сложилось впечатление, что значение, вероятно, было выбрано как «выше, чем я». мне когда-нибудь понадобится "а не" самый высокий, который я готов использовать ".(eval-when-compile (* 1024 1024 1024))
наmost-positive-fixnum
(пожалуйста, сделайте это, я уверен, что каждый, кто сталкивается с вашим вопросом, копирует ваш код в свою конфигурацию) .Ответы:
Насколько я знаю, если у вас есть ОЗУ, это нормально, но если Emacs когда-либо достигнет очень высокого уровня использования до GC'ing, это может занять много времени. Я не уверен точно, что означает Илай; ISTM, что если у вас достаточно памяти, все будет хорошо, но он здесь эксперт.
Сказав это, я некоторое время использовал эти строки в своем файле инициализации, и это помогает сократить время запуска, не делая изменения постоянными:
источник
after-init-hook
?