Nó chỉ ra rằng hiệu suất rất khác nhau có liên quan đến thu gom rác. Mỗi cuộc gọi đến chức năng sẽ chậm hơn cho đến khi bộ sưu tập rác được chạy. Với stock emacs, gc đã chạy vài giây một lần, nhưng tôi đã có một dòng trong init.el để cải thiện thời gian khởi động đặt gc-cons-ngưỡng thành 20 MB và điều đó có nghĩa là gc được chạy không thường xuyên hơn, gây ra các điểm chuẩn báo cáo thời gian chậm hơn và chậm hơn cho đến khi một gc được chạy sau vài phút, sau đó thời gian sẽ giảm mạnh và nhanh chóng trở lại.
Sau khi trở lại trạng thái gc-cons-thr mặc định, việc đo điểm chuẩn trở nên dễ dàng hơn.
Sau đó, tôi đã lược tả bộ nhớ với profiler ( M-x profiler-start
) tích hợp và phát hiện ra rằng các lệnh gọi cú pháp-pps gây ra sự phân bổ nhiều nhất, vì vậy sau một số tối ưu hóa để gọi cú pháp-pps ít hơn tôi thường đạt được hiệu suất chấp nhận được.
Sử dụng chế độ jit-lock-mode (thêm chức năng qua jit-lock-register) dường như là cách dễ nhất để khóa phông chữ nhiều dòng hoạt động một cách đáng tin cậy, vì vậy đó là phương pháp tôi đã chọn.
Chỉnh sửa: Sau khi phát hiện ra rằng hiệu suất vẫn chưa đủ tốt trong các bộ đệm rất lớn, tôi đã dành nhiều thời gian để tối ưu hóa việc sử dụng và phân bổ cpu, đo lường các cải tiến hiệu suất với trình biên dịch Emacs tích hợp ( M-x profiler-start
). Tuy nhiên, Emacs vẫn sẽ nói lắp và treo khi di chuyển nhanh qua các bộ đệm rất lớn. Loại bỏ chức năng khóa jit mà tôi đã đăng ký jit-lock-register
sẽ loại bỏ tình trạng nói lắp và treo, nhưng hồ sơ cho thấy chức năng khóa jit hoàn thành trong khoảng 8 ms, đủ nhanh để cuộn trơn tru. Việc loại bỏ cuộc gọi đến jit-lock-register
và thay vào đó bằng cách sử dụng trình so khớp khóa từ khóa thông thường đã giải quyết được vấn đề.
TLDR: Làm điều này là chậm và sẽ nói lắp:
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(jit-lock-register 'my-font-lock-function)
Làm điều này là nhanh chóng và sẽ không nói lắp:
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(defun my-font-lock-matcher (limit)
(my-font-lock-function (point) limit)
nil)
(setq font-lock-defaults
(list
...
;; Note that the face specified here doesn't matter since
;; my-font-lock-matcher always returns nil and sets the face on
;; its own.
`(my-font-lock-matcher (1 font-lock-keyword-face nil))))