Đề 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.
Đ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
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