2009-02-20 33 views
42

Tôi tùy chỉnh Emac rất nhiều. Gần đây, tôi đã thêm một cái gì đó vào cấu hình .emacs của tôi mà không thường xuyên chốt CPU của tôi ở mức 100%, nhưng tôi thực sự không biết nó là gì.Lời khuyên cho việc lược tả sai lầm Emacs Lisp?

Nếu tôi nhấn C-g nhiều lần, cuối cùng tôi sẽ nhận được thông báo bên dưới minibuffer hỏi tôi có muốn tự động lưu tệp của mình không và sau đó nếu tôi muốn hủy hoàn toàn các emacs. Nếu tôi tiếp tục nói không và cứ nhấn C-g, cuối cùng tôi có thể quay lại chạy các emac như bình thường. Một giờ hoặc lâu hơn sau đó nó sẽ xảy ra một lần nữa.

Tôi có thể tiếp tục giống như tôi, nhận xét những điều khác nhau mà tôi đã thêm gần đây, khởi động lại các emacs, cố gắng thu hẹp thủ phạm, nhưng sẽ chậm.

Có cách nào tôi có thể lập tiểu sử emacs trực tiếp để tìm ra chức năng lisp nào đang hogging CPU không?

Trả lời

48

Đề xuất thiết lập debug-on-quit thành t để bạn có thể tìm hiểu Emacs là gì tốt nhất. Bạn có thể nghĩ về điều này như là một hình thức lấy mẫu hồ sơ với một mẫu đơn: thường là một mẫu duy nhất là tất cả những gì bạn cần.


Cập nhật: Bắt đầu với phiên bản 24.3, Emacs chứa hai profilers. Có một hồ sơ lấy mẫu (mới) trong profiler.el và một hồ sơ thiết bị (cũ) trong elp.el.

Hồ sơ lấy mẫu là documented here. Việc sử dụng khá đơn giản:

Để bắt đầu lập hồ sơ, hãy nhập M-x profiler-start. Bạn có thể chọn để cấu hình bằng cách sử dụng bộ xử lý, sử dụng bộ nhớ, hoặc cả hai. Sau khi thực hiện một số công việc, hãy nhập M-x profiler-report để hiển thị bộ đệm tóm tắt cho từng tài nguyên mà bạn đã chọn để cấu hình. Khi bạn đã hoàn thành hồ sơ, hãy nhập M-x profiler-stop.

Dưới đây là một số ví dụ về kết quả từ phiên làm việc cpu+mem với phiên bản Perforce/Emacs integration mà tôi duy trì. Tôi đã mở rộng chức năng trên cùng (progn) để tìm hiểu where the CPU time and memory use is coming from.

Function           Bytes % 
- progn          26,715,850 29% 
    - let          26,715,850 29% 
    - while         26,715,850 29% 
     - let         26,715,850 29% 
     - cond         26,715,850 29% 
      - insert        26,715,850 29% 
      + c-after-change     26,713,770 29% 
      + p4-file-revision-annotate-links  2,080 0% 
+ let           20,431,797 22% 
+ call-interactively       12,767,261 14% 
+ save-current-buffer       10,005,836 11% 
+ while           8,337,166 9% 
+ p4-annotate-internal       5,964,974 6% 
+ p4-annotate         2,821,034 3% 
+ let*           2,089,810 2% 

Bạn có thể thấy rằng thủ phạm là c-after-change, vì vậy nó trông như thể tôi có thể tiết kiệm rất nhiều thời gian CPU và bộ nhớ bằng cách locally binding inhibit-modification-hooks to t around this code.


Bạn cũng có thể sử dụng Profiles Emacs Lisp. Điều này khá ít tài liệu: bạn sẽ phải đọc các nhận xét trong chi tiết elp.el để biết chi tiết, nhưng về cơ bản bạn chạy elp-instrument-package để bật tiểu sử cho tất cả các hàm có tiền tố nhất định và sau đó elp-results để xem kết quả.

Dưới đây là một số kết quả điển hình sau khi nhập M-x elp-instrument-package RET c- RET, fontifying 4.000 dòng C, và sau đó chạy elp-results (và sử dụng elp-sort-by-function để sắp xếp theo số lượng cuộc gọi):

Function Name     Call Count Elapsed Time Average Time 
============================= ========== ============ ============ 
c-skip-comments-and-strings 107   0.0   0.0 
c-valid-offset     78   0.0   0.0 
c-set-offset     68   0.031   0.0004558823 
c-end-of-macro     52   0.0   0.0 
c-neutralize-CPP-line   52   0.0   0.0 
c-font-lock-invalid-string  20   0.0   0.0 
c-set-style-1     19   0.031   0.0016315789 
... 

Trong trường hợp cụ thể của bạn các hồ sơ không giúp ngay lập tức, bởi vì bạn không biết gói nào có lỗi. Nhưng nếu bạn có thể đoán (hoặc sử dụng debug-on-quit để tìm nó chắc chắn) thì trình hồ sơ có thể giúp bạn chẩn đoán vấn đề một cách chi tiết.

5

Đây không phải là câu trả lời cho câu hỏi của bạn, nhưng thay vì làm điều bình luận và khởi động lại, bạn có thể bắt đầu emacs với tùy chọn -q, tải .emac của bạn vào bộ đệm và đánh giá mỗi sexpr mình với Cx Ce để theo dõi một trong những vi phạm.

+0

Điểm tốt, tôi làm eval thể hiện tất cả các thời gian, nhưng chế độ này của gỡ lỗi hadn' t ban đầu xảy ra với tôi. – EnigmaCurry

+3

Bạn không muốn đánh giá mỗi sexp lần lượt (trừ khi bạn có rất ít). Sử dụng tìm kiếm nhị phân, với 'eval-region '. – Drew

8

Bạn đã thử: Options->Enter debugger on Quit/C-g? (Đây là trên emacs22)

Nếu bạn cần phải gỡ rối bắt đầu-up của emacs: sử dụng emacs -q --no-site-file, hãy truy cập của bạn .emacs (hoặc site-start.el hoặc bất cứ điều gì), kích hoạt menu Options->Enter debugger on Quit/C-g, và sau đó mục trình đơn Emacs-Lisp->Evaluate bufferC-g khi nó xuất hiện đóng băng. Có thể có cách dễ dàng hơn để thực hiện việc này .........

6

Với dope.el bạn có thể lập cấu hình toàn bộ các tệp .emac hoặc nhiều tệp elisp được tải khi khởi động. Tải xuống từ www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/

M-x dope-quick-start sẽ hiển thị hướng dẫn giới thiệu nhỏ.

Edit: URL ban đầu bây giờ đã không còn tồn tại, nhưng có một gương làm việc trên Git Hub:
https://raw.github.com/emacsmirror/dope/master/dope.el

+0

Cảm ơn bạn đã gói dope. Tôi đã có thể cấu hình lại các .emac của tôi để tải trong chưa đầy một giây bằng cách sử dụng gói này. :) – Amjith

Các vấn đề liên quan