Tối ưu hóa hiệu suất khóa phông chữ


13

Tôi muốn thực hiện một biến thể của khớp khóa phông chữ neo. Tôi có các định nghĩa hàm bắt đầu bằng một danh sách các tên và tôi muốn các tên đó được tô sáng bên trong thân hàm.

Tôi đã tạo một hàm thực hiện điều này và đăng ký nó như một hàm jit-lock với jit-lock-register, tuy nhiên, hiệu suất khá kém và cuộn chậm trong các tệp lớn hơn.

  • Làm thế nào tôi có thể đo lường hiệu suất? Nếu tôi chỉ gọi thời gian cho chức năng của mình trên một tệp lớn (với thời gian trôi nổi trước và sau hoặc với elp) tôi sẽ có hiệu suất rất khác nhau, phải mất từ ​​0,65 đến 12 giây. Có một cách được đề nghị để hiệu suất khóa phông chữ chuẩn?
  • Có sự khác biệt nào về hiệu suất giữa trình so khớp neo được xác định trong từ khóa khóa phông chữ và thêm chức năng thông qua jit-lock-register không?

Chỉnh sửa: Có vẻ như sự thay đổi trong hiệu suất có liên quan đến việc thu gom rác, các lệnh gọi hàm jit-lock của tôi sẽ liên tục chậm hơn với mỗi lần gọi cho đến khi bộ sưu tập rác được chạy, tại đó chúng sẽ nhanh chóng trở lại.


Đối với mục đầu tiên, hãy thử trình hồ sơ.
Malabarba

Tôi có thể (và đã) sử dụng trình lược tả để xem phần nào trong mã của tôi mất thời gian, nhưng vì hiệu suất không nhất quán nên khó có thể biết liệu có bất kỳ thay đổi nào tôi thực hiện có cải thiện hay không.
Joakim Hårsman

Bạn có một số mã chúng tôi có thể kiểm tra? Điều đó có thể giúp chúng tôi rất nhiều.
PythonNut

1
Mặc dù không phải về cấu hình hoặc tối ưu hóa vi mô, nhưng tôi đã tìm thấy gói font-lock-studio là một công cụ hữu ích khác để hiểu hiệu suất khóa phông chữ. Nó có thể giúp giống như bất kỳ trình gỡ lỗi bước tương tác nào khác có thể giúp - bạn có thể khám phá các đường dẫn thực thi không như bạn mong đợi và đó là vấn đề hiệu suất chính.
Greg Hendershott

Cảm ơn các mẹo về font-lock-studio, thật tuyệt vời! Không giúp với chức năng khóa jit, nhưng chắc chắn với mọi thứ khác.
Joakim Hårsman

Câu trả lời:


8

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-registersẽ 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-registervà 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))))

Bạn có thể chia sẻ mã bạn đã sử dụng? Giải pháp của bạn có thể giúp những người khác đang tìm kiếm để đạt được điều tương tự.
Manuel Uberti

Tôi đã không thực sự sử dụng bất kỳ mã cụ thể nào, tôi chỉ gọi cú pháp ít hơn. Bạn có thể kiểm tra mã trong câu hỏi ở đây: bitbucket.org/harsman/dyalog-mode/src/. Hãy tìm dyalog-fontify-locals.
Joakim Hårsman

Tôi đoán dyalog-fontify-locals-matchernên my-font-lock-matchervà một trong những endnên limit. Dù sao, khám phá thực sự thú vị!
Lindydancer

@Lindydancer: Vâng cảm ơn bạn. Đã sửa.
Joakim Hårsman

1
Re : gc-cons-threshold, nếu bạn hoàn toàn nhầm lẫn với các giá trị nội bộ để cải thiện thời gian khởi động, tôi khuyên bạn nên sử dụng emacs-startup-hookđể khôi phục chúng sau đó.
phils
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.