TL; DR Tôi có một số lượng lớn các gói đến nỗi nó làm tổn thương thời gian khởi động của tôi. Nếu bạn không tin đó có thể là trường hợp, hãy đọc tiếp.
Thời gian khởi động Emacs của tôi khá nhỏ. Tôi không sử dụng use-package
, tôi chỉ đặt hàng tấn hook và autoload
s để gần như tất cả mã được hoãn lại. Trong thực tế, toàn bộ mọi thứ được tải trong chưa đầy nửa giây, mặc dù nó có vẻ như là một mớ hỗn độn điên rồ.
Tuy nhiên, theo thời gian tôi nhận thấy rằng thời gian khởi động của tôi trở nên chậm hơn một cách khó hiểu, không thể giải thích được. Điều này cuối cùng đã đến thời điểm khởi động là ≥ 1 giây. Cuối cùng tôi đã có đủ và tôi đã đi sâu vào gốc rễ của vấn đề. Cuối cùng tôi đã nhận xét toàn bộ ~/.emacs
tập tin của mình và thấy rằng thời gian khởi động vẫn là 1 giây. Trên thực tế, nó chỉ cạo được ~ 0.2
giây, đôi khi còn ít hơn. Sau đó, tôi đã thử emacs -q
và thấy rằng thời gian khởi động là ~ 0.1
giây.
Khi kiểm tra phần này của hướng dẫn Elisp, tôi đã tìm ra lý do tại sao emacs -q
việc giảm thời gian khởi động lại rất nhiều. Rõ ràng emacs -q
ngăn Emacs làm ba điều khi khởi động:
- tải tập tin init của bạn
- tải
default.el
tập tin của bạn - gọi
package-initialize
Chúng tôi đã loại trừ tập tin init của tôi, vì nhận xét toàn bộ ~/.emacs
tôi gần như không có gì. Tôi không sử dụng một default.el
tập tin, vì vậy đó cũng bị loại trừ. Mà để lại package-initialize
là thủ phạm cho hiệu suất hit.
Tại sao sẽ package-initialize
chiếm quá nhiều thời gian khởi động? Đó là câu hỏi đầu tiên tôi tự hỏi mình. Tôi không tự động tải mọi thứ à? Vâng, vâng. Nhưng đó chính xác là vấn đề.
Tôi tìm thấy bài đăng này giải thích rằng các gói "kích hoạt" bao gồm đọc các tệp tự động tải và thiết lập đường dẫn tải. Điều này rõ ràng phải chịu một hình phạt I / O khi bạn có nhiều gói vì bạn có nhiều tệp tự động tải để đọc và nhiều đường dẫn để thiết lập. Thật không may, không có điều này, nhiệm vụ quản lý tự động tải rơi vào tay người dùng. Nói cách khác, không cho phép package.el
thu thập dữ liệu hệ thống tệp cho các tệp và đường dẫn tự động tải, tôi sẽ phải tự quản lý đó có thể là một quá trình dễ bị lỗi và dễ bị lỗi.
Tôi không muốn đi vào con đường đó. Tôi hiện có 116 gói, với 107 trong số đó là ELPA và 25 trong số đó là các gói phụ thuộc. Tôi chắc chắn rằng con số khổng lồ này là thứ đang làm giảm hiệu suất của tôi rất nhiều. Nhưng tôi rơi vào tình trạng khó khăn vì tôi không muốn xóa bất kỳ gói hàng nào của mình.
Có biện pháp khắc phục nào trong tình huống như vậy để lấy lại thời gian khởi động nhanh như chớp của tôi không?
Cập nhật:
Chúng tôi đã bắt đầu một chủ đề mới trong emacs-devel
danh sách gửi thư về một số bản vá của Stefan Monnier (một mô tả về các bản vá này có ở đây ) để giải quyết vấn đề này. Bất cứ ai cũng được chào đón để kiểm tra các bản vá của mình và đưa ra phản hồi.
Một cập nhật khác:
Có vẻ như Stefan Monnier không còn quan tâm đến vấn đề này nữa hoặc anh ta không nhận được tin nhắn của tôi. Tôi có xu hướng tin rằng trước đây, điều đó là tốt, mặc dù tôi sẽ đánh giá cao một số loại phản ứng từ anh ta nếu đó là trường hợp. Dù sao, mã mà ông đã tạo ra cho vấn đề này cho đến nay hoạt động khá tốt. Các bản vá gần đây nhất của anh ta có thể được tìm thấy ở đây (cho Emacs 25.3) và ở đây (cho chi nhánh chính của Emacs).Tôi đã thấy những cải thiện tốt về thời gian khởi động của mình nhờ các bản vá của anh ấy và tôi đang ở thời điểm mà tôi cảm thấy thoải mái với thời gian khởi động của mình rằng nó được tối ưu hóa nhất có thể mà không làm mất đi các tính năng tùy chỉnh của tôi. Tôi đã hy vọng rằng những bản vá này sẽ biến nó thành tuyến chính của Emacs vào một lúc nào đó, nhưng tôi đoán rằng tôi (hoặc ai đó) sẽ phải cầm ngọn đuốc cho nó ngay bây giờ, thay vì Stefan. Chúng tôi đã có một chút ít trong danh sách gửi thư về chuyển nhượng và cấp phép bản quyền. Ban đầu tôi không thoải mái với việc đó, nhưng do một số ý kiến từ Richard Stallman và những người khác, việc chuyển nhượng bản quyền có thể không hạn chế như tôi nghĩ ban đầu. Hơn nữa, tôi có thể cam kết các tác phẩm của mình với phạm vi công cộng thay thế cho việc chuyển nhượng bản quyền.
Trong mọi trường hợp, cảm ơn Stefan cho các bản vá cho đến nay! Tôi hy vọng bạn sẽ tiếp tục phát triển những thay đổi này, nhưng nếu không, điều đó không sao và tôi có thể tiếp tục phát triển nó vào một lúc nào đó. Tôi cũng cảm ơn tất cả những người khác đã cung cấp cái nhìn sâu sắc và đóng góp để giải quyết vấn đề này.
Một cập nhật khác:
Wow, có vẻ như tính năng này cuối cùng đã hạ cánh và sẽ có trong Emacs 27. Cảm ơn Stefan Monnier!
use-package
là cách để đi cho việc này.