ปรากฎว่าประสิทธิภาพที่แตกต่างกันนั้นเกี่ยวข้องกับการเก็บขยะ การเรียกใช้ฟังก์ชันแต่ละครั้งจะช้าลงจนกว่าจะมีการรวบรวมขยะ เมื่อใช้ emacs หุ้น gc จะทำงานทุก ๆ สองสามวินาที แต่ฉันมีบรรทัดใน init.el ของฉันเพื่อปรับปรุงเวลาเริ่มต้นที่ตั้งค่า gc-cons-threshold เป็น 20 MB และนั่นหมายความว่า gc ทำงานได้ไม่บ่อยนัก รายงานเวลาที่ช้าลงและช้าลงจนกว่า gc จะทำงานหลังจากผ่านไปสองสามนาทีจากนั้นเวลาจะลดลงและจะเร็วขึ้นอีกครั้ง
หลังจากเปลี่ยนกลับเป็น gc-cons-threshhold เริ่มต้นการเปรียบเทียบก็ง่ายขึ้น
ฉันสร้างโปรไฟล์สำหรับหน่วยความจำด้วย built in profiler ( M-x profiler-start
) และค้นพบว่าการเรียกใช้ไวยากรณ์ -ppss ทำให้เกิดการจัดสรรมากที่สุดดังนั้นหลังจากการเพิ่มประสิทธิภาพบางอย่างในการเรียกใช้ไวยากรณ์ -ppss บ่อยครั้งที่ฉันได้รับประสิทธิภาพที่ยอมรับได้
การใช้ jit-lock-mode (การเพิ่มฟังก์ชั่นผ่าน jit-lock-register) ดูเหมือนจะเป็นวิธีที่ง่ายที่สุดในการทำให้การล็อคแบบอักษรหลายบรรทัดทำงานได้อย่างน่าเชื่อถือดังนั้นนั่นเป็นวิธีที่ฉันเลือก
แก้ไข: หลังจากค้นพบว่าประสิทธิภาพการทำงานยังไม่ดีพอในบัฟเฟอร์ที่มีขนาดใหญ่มากฉันใช้เวลาส่วนใหญ่ในการปรับแต่งการใช้และการจัดสรรซีพียูให้มากที่สุดวัดการปรับปรุงประสิทธิภาพด้วยตัวสร้างโปรไฟล์ Emacs ( M-x profiler-start
) อย่างไรก็ตาม Emacs ยังคงพูดติดอ่างและแขวนเมื่อเลื่อนผ่านบัฟเฟอร์ขนาดใหญ่มากอย่างรวดเร็ว การลบฟังก์ชั่น jit-lock ที่ฉันลงทะเบียนไว้jit-lock-register
จะลบการพูดติดอ่างและแฮงค์ แต่การทำโปรไฟล์แสดงให้เห็นว่าฟังก์ชั่น jit-lock นั้นเสร็จสมบูรณ์ในเวลาประมาณ 8 ms ซึ่งน่าจะเร็วพอสำหรับการเลื่อนที่ราบรื่น การลบการโทรออก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))))