Làm thế nào để cải thiện hiệu suất của việc cắt giảm bộ đệm eshell?


8

Tôi hiện đang cắt bớt bộ đệm ở 20.000 dòng bằng cách thêm vào phần sau vào cấu hình của mình:

(setq eshell-buffer-maximum-lines 20000)
;; automatically truncate buffer after output
(add-to-list 'eshell-output-filter-functions 'eshell-truncate-buffer)

Điều này hoạt động tuyệt vời cho <20.000 dòng và khi bộ đệm đạt 20.000 dòng, nó sẽ bị cắt ngắn trên mỗi dòng (vì vậy nó nằm ở 20.001 dòng mãi mãi). Tuy nhiên, khi bộ đệm đạt 20.000 dòng, mỗi dòng tiếp theo sẽ mất nhiều thời gian hơn để in và khiến CPU của emacs ngồi ở mức 100% trong một thời gian khá lâu.

Có cách nào để cải thiện hiệu suất của việc cắt bớt bộ đệm không? Có lẽ chỉ cắt ngắn mỗi 100 dòng được thêm vào? Nó không giống như tôi thực sự cần nó chính xác là 20.000 dòng, tôi chỉ không muốn bộ đệm phát triển vô hạn.


3
Tại sao không cắt ngắn sau thời gian nhàn rỗi?
PythonNut

nó bị cắt ngắn trên mỗi dòng vì bạn chạy eshell-truncate-buffermỗi lần đầu ra được tạo ra. Nó có thể có ý nghĩa hơn để làm cho việc cắt ngắn độc lập với sản xuất đầu ra. Như @PythonNut đề xuất cắt ngắn sau khi hết thời gian có vẻ hợp lý hơn.
rekado

Câu trả lời:


6

Lấy đề xuất từ ​​PythonNut và rekado, tôi đã chuyển sang cắt ngắn khi không hoạt động, vì vậy giải pháp hiện tại của tôi trông như sau:

(defun my/truncate-eshell-buffers ()
  "Truncates all eshell buffers"
  (interactive)
  (save-current-buffer
    (dolist (buffer (buffer-list t))
      (set-buffer buffer)
      (when (eq major-mode 'eshell-mode)
        (eshell-truncate-buffer)))))

;; After being idle for 5 seconds, truncate all the eshell-buffers if
;; needed. If this needs to be canceled, you can run `(cancel-timer
;; my/eshell-truncate-timer)'
(setq my/eshell-truncate-timer
      (run-with-idle-timer 5 t #'my/truncate-eshell-buffers))

Sau này, tôi không còn cần phải thêm 'eshell-truncate-buffervào 'eshell-output-filter-functions. Nó đang làm việc rất tốt!

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.