매우 다양한 성능이 가비지 수집과 관련이있는 것으로 나타났습니다. 가비지 수집이 실행될 때까지 함수를 호출 할 때마다 속도가 느려집니다. 스톡 이맥스를 사용하면 gc가 몇 초마다 실행되었지만 시작 시간을 개선하여 gc-cons-threshold를 20MB로 설정하고 gc가 훨씬 더 자주 실행되지 않아 벤치 마크가 발생하는 init.el에 줄이 생겼습니다. 몇 분 후에 gc가 실행될 때까지 느리고 느린 타이밍을보고하면 시간이 급감하고 다시 빠릅니다.
기본 gc-cons-threshhold로 되 돌린 후 벤치마킹이 쉬워졌습니다.
그런 다음 내장 프로파일 러 ( M-x profiler-start
)를 사용하여 메모리를 프로파일 링 하고 syntax-ppss를 호출하면 가장 많은 할당이 발생한다는 것을 알았습니다. 따라서 구문 -ppss를 호출하는 최적화가 덜 자주 허용되는 성능을 달성했습니다.
jit-lock-mode를 사용하여 (jit-lock-register를 통해 기능 추가) 다중 행 글꼴 잠금을 안정적으로 작동시키는 가장 쉬운 방법 인 것 같습니다. 이것이 제가 선택한 방법입니다.
편집 : 성능이 여전히 매우 큰 버퍼에서 충분하지 않다는 것을 알게 된 후 내장 Emacs 프로파일 러 ( M-x profiler-start
)를 사용하여 CPU 사용 및 할당을 최적화하는 데 많은 시간을 보냈습니다 . 그러나 Emacs는 매우 큰 버퍼를 빠르게 스크롤 할 때 더듬 거리고 멈추게됩니다. 내가 등록한 jit-lock 기능 jit-lock-register
을 제거하면 말더듬과 정지가 제거되지만 프로파일 링을 통해 jit-lock 기능이 약 8ms 내에 완료되는 것으로 나타났습니다. jit-lock-register
일반 글꼴 잠금 키워드 매처를 호출 하거나 대신 사용하여 문제를 해결했습니다.
TLDR :이 작업은 느리고 말더듬이됩니다.
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(jit-lock-register 'my-font-lock-function)
이 작업은 빠르고 빠르지 않습니다.
(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))))