Làm cách nào để khắc phục sự cố Emacs rất chậm?


41

Tôi đang viết một tài liệu và tôi gặp vấn đề với hiệu suất của Emacs mà tôi nghĩ đã xuất hiện ngày hôm qua. Tôi chưa thực hiện bất kỳ thay đổi nào trong tệp init của mình hoặc cài đặt bất kỳ gói mới nào.

Vấn đề là trong khi tôi đang viết, có một độ trễ rất đáng chú ý giữa việc nhấn các chữ cái trên bàn phím và để chúng hiển thị trên màn hình. Đôi khi tôi xem chúng vẫn in trên màn hình sau khi tôi gõ xong từ.

Tôi không biết có vấn đề nào khác ngoại trừ tốc độ gõ (tôi chỉ có thể đoán là có) nhưng tôi đã không chú ý đến chúng.

Điều gì có thể gây ra vấn đề này?
Có phải do Emacs gây ra hay là do hiệu suất của máy tính của tôi? Nói chung các biến ảnh hưởng đến hiệu suất của Emacs là gì?

Phiên bản Emacs của tôi là GNU Emacs 24.3.1

Chế độ hoạt động chính là:

  1. Mủ cao su

và các chế độ hoạt động nhỏ là:

  1. Tự động hoàn thành
  2. Tự động sáng tác
  3. Tự động nén
  4. Tự động mã hóa
  5. Nháy mắt
  6. Tên tệp-Shadow
  7. Khóa chữ
  8. Toàn cầu tự động hoàn thành
  9. Global-Font-Lock Global-Hl-Line
  10. Số dòng
  11. Con lăn chuột
  12. Shell-Dirtrack
  13. Show-Paren
  14. Smartparens
  15. Smartparens-Toàn cầu
  16. Tooltip Transient-Mark

5
C-h msẽ tiết lộ chế độ chính và tất cả các chế độ nhỏ đang hoạt động. Bạn có thể từ từ vô hiệu hóa từng chế độ nhỏ cho đến khi bạn theo dõi nguyên nhân. Nó có thể là chế độ chính, nhưng các chế độ nhỏ là nghi phạm có khả năng nhất. Nếu không chỉ định chế độ nào bạn đang sử dụng, bất kỳ ai ở đây sẽ chỉ bị đâm vào bóng tối về những gì đang xảy ra với vấn đề của bạn. Tôi có một tình huống hiếm gặp xảy ra với một số hình ảnh đặc biệt - ví dụ: khi ai đó gửi email cho tôi thứ gì đó có ký hiệu điện thoại hoặc các ký hiệu đặc biệt khác trong iPhone - nhưng đó là sự cố chậm bị cô lập do các ký hiệu đặc biệt gây ra.
luật

2
linum-modelàm chậm hiệu suất trong bộ đệm lớn. nlinum-modeđược viết bởi Stefan là tốt hơn cho bộ đệm lớn hơn.
luật

Điều gì đang xảy ra trên máy tính của bạn? Bao nhiêu bộ nhớ đang được sử dụng? CPU của bạn hoạt động như thế nào và chương trình nào chịu trách nhiệm cho phần lớn việc sử dụng nó? Vấn đề cũng có thể là một số chương trình khác.
Dave

2
Ồ, tôi vừa đăng tài liệu tham khảo này trong một chủ đề khác: gnu.org/software/emacs/manual/html_node/elisp/Profiling.html - đây sẽ là một khởi đầu tốt. Ngoài ra, một cảnh quay trong bóng tối: hãy thử vô hiệu hóa khóa gnu.org/software/emacs/manual/html_node/emacs/Font-Lock.html - đây là nghi ngờ thông thường đầu tiên của tôi (thường chiếm hầu hết các chu kỳ CPU ).
wvxvw

1
Số lượng gợi ý tuyệt đối trong các bình luận này cho thấy câu hỏi này hơi mơ hồ. Tôi đã điều chỉnh lại tiêu đề để yêu cầu hướng dẫn, thay vì một giải pháp. Tôi cũng đã cung cấp một câu trả lời phù hợp. Vui lòng đặt câu hỏi mới khi bạn đã làm theo các hướng dẫn đó hoặc để lại nhận xét nếu chúng không rõ ràng.
Malabarba

Câu trả lời:


64

Điều gì có thể gây ra vấn đề này? Có phải do Emacs gây ra hay là do hiệu suất của máy tính của tôi? Nói chung các biến ảnh hưởng đến hiệu suất của Emacs là gì?

Emacs có khoảng 50.000 biến nội bộ và vài nghìn gói bên ngoài trung bình ở mức vài chục biến, mỗi biến, bạn không thể mong đợi ai đó trả lời điều này theo nghĩa chung. :-)

Bạn có thể thấy điều đó chỉ bằng cách nhìn vào luồng ý kiến ​​dưới câu hỏi của bạn. Có nửa tá đề xuất khác nhau trong đó, tất cả đều có giá trị như nhau.

Bạn có thể làm gì để xác định vấn đề?

Tùy chọn 1: Tắt chế độ

Bắt đầu vô hiệu hóa các chế độ nhỏ mà bạn đã liệt kê và xem chế độ nào giải quyết vấn đề hiệu suất của bạn. Tôi sẽ bắt đầu với smartparens, auto-complete, line-numberfont-lock, và sau đó làm theo xuống danh sách.

"Tôi đã không có vấn đề này ngày hôm qua" có nghĩa là rất ít, đừng quá tin tưởng vào nó . Chỉ cần bắt đầu vô hiệu hóa các chế độ nhỏ cho đến khi một cái gì đó giải quyết nó.

Nếu không có chế độ nhỏ nào khắc phục được sự cố của bạn, thì hãy bắt đầu nhận xét các phần của tệp init cho đến khi bạn tìm ra đoạn mã nào gây ra sự cố này. Trong mọi trường hợp, hãy hỏi một câu hỏi mới khi bạn có một cái gì đó cụ thể hơn.

Cách 2: Trình hồ sơ

  1. Gọi M-x profiler-start RET RET(thứ hai RETlà để xác nhận cpu);
  2. Thực hiện một số gõ, tốt nhất là toàn bộ một đoạn hoặc nhiều hơn;
  3. Gọi M-x profiler-report.

Điều đó sẽ cung cấp cho bạn một bộ đệm mô tả thời gian cpu được thực hiện bởi mỗi chức năng. Nhấn TABvào một dòng sẽ mở rộng nó để hiển thị các chức năng bên trong nó. Điều hướng bộ đệm này cho đến khi bạn tìm ra chức năng nào đang chiếm quá nhiều thời gian của CPU.

Tôi phải làm gì sau đó?

Khi bạn tìm thấy chức năng hoặc gói hoặc đoạn trích gây ra độ trễ, bạn có thể (không theo thứ tự cụ thể nào):

  • Đặt một câu hỏi mới ở đây liên quan đến chế độ nhỏ cụ thể đó (hoặc chức năng hoặc đoạn trích).
  • Báo cáo lỗi cho người bảo trì gói.
    • Kiểm tra các ý kiến ​​ở đầu tệp nguồn của gói. Nếu nó chứa một URL (đặc biệt trên github), có thể có một trình theo dõi vấn đề ở đó.
    • Một số gói cung cấp một lệnh như M-x PACKAGE-bug-report.
    • Email của anh ấy hoặc cô ấy phải ở đầu tập tin nguồn của gói.
  • Nếu đó là gói tích hợp, bạn có thể báo cáo với M-x report-emacs-bug.
  • Ngay cả đối với các gói không được tích hợp sẵn, bạn có thể yêu cầu trợ giúp trong help-gnu-emacsdanh sách gửi thư.

4
Đây là những hướng dẫn tuyệt vời. Cảm ơn nhiều! Như tôi đã nói trong các bình luận về qusetion của tôi, tôi không biết rằng nó sẽ mơ hồ. Tôi nghĩ rằng câu trả lời sẽ là cơ bản cho một chuyên gia về Emacs (giống như nhiều bạn). Dù sao "hướng dẫn" này là tuyệt vời và tôi rất vui vì câu hỏi của tôi dẫn đến điều đó. :)
Adam

3
+100000 để sử dụng trình hồ sơ. Nếu bạn ngớ ngẩn (như tôi) và vô tình làm điều gì đó như thêm một hàm gọi đắt tiền vào dòng chế độ trong mỗi bộ đệm, thì đây là cách chắc chắn để tìm hiểu điều gì đang xảy ra.
Radon Rosborough

Làm thế nào để bạn vô hiệu hóa chế độ nhỏ? Đã bật các chế độ nhỏ: Async-Bytecomp-Gói Tự động hoàn thành Tự động nén Tự động nén tệp Tên-Shadow Flycheck Flyspell Font-Lock Global-Auto-Complete Global-Auto-Revert Global-Eldoc Global-Flycheck Global-Font-Global Global -Git-Commit Global-Hl-Line Global-Hungry-Delete Global-Linum Line-Number Linum Magit-Auto-Revert Org-Bullets Org-Indent Override-Global Projectile Pyvenv Recentf Save-Place Shell-Dirtrack Show-Smartenens Show-Smartparens-Global Size-Chỉ định Smartparens Smartparens-Global
Stryker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.