Saya ingin melakukan varian pencocokan kunci font berlabuh. Saya memiliki definisi fungsi yang dimulai dengan daftar nama, dan saya ingin nama-nama itu disorot di dalam tubuh fungsi.
Saya telah membuat fungsi yang melakukan ini dan mendaftarkannya sebagai fungsi jit-lock dengan jit-lock-register, namun, kinerjanya sangat buruk dan gulir keterlambatan dalam file yang lebih besar.
- Bagaimana saya bisa mengukur kinerja? Jika saya hanya waktu memanggil fungsi saya pada file besar (dengan float-time sebelum dan sesudah atau dengan elp) saya mendapatkan kinerja yang sangat bervariasi, dibutuhkan sekitar 0,65 hingga 12 detik. Apakah ada cara yang disarankan untuk mengukur kinerja kunci font?
- Apakah ada perbedaan kinerja antara pencocokan berlabuh yang didefinisikan dalam font-lock-keywords dan menambahkan fungsi melalui jit-lock-register?
Sunting: Tampaknya variabilitas dalam kinerja terkait dengan pengumpulan sampah, pemanggilan fungsi jit-lock saya semakin lama semakin lambat dengan setiap pemanggilan sampai pengumpulan sampah dijalankan, pada titik mana mereka menjadi cepat lagi.
font-lock
performance
Joakim Hårsman
sumber
sumber
Jawaban:
Ternyata kinerja yang sangat bervariasi terkait dengan pengumpulan sampah. Setiap panggilan ke fungsi akan menjadi lebih lambat sampai pengumpulan sampah dijalankan. Dengan emacs saham, gc dijalankan setiap beberapa detik, tetapi saya memiliki garis di init.el saya untuk meningkatkan waktu startup yang menetapkan gc-cons-threshold menjadi 20 MB, dan itu berarti gc dijalankan lebih jarang, menyebabkan tolok ukur untuk laporkan lebih lambat dan waktu lebih lambat sampai gc dijalankan setelah beberapa menit, maka waktu akan menurun dan cepat lagi.
Setelah kembali ke ambang default gc-cons-threshold, pembandingan menjadi lebih mudah.
Saya kemudian membuat profil untuk memori dengan built in profiler (
M-x profiler-start
), dan menemukan bahwa panggilan ke sintaks-pps menyebabkan alokasi terbanyak, jadi setelah beberapa optimasi untuk memanggil sintaks-pps kurang sering saya mencapai kinerja yang dapat diterima.Menggunakan mode jit-lock-mode (menambahkan fungsi melalui jit-lock-register) tampaknya menjadi cara termudah untuk mendapatkan penguncian font multi baris agar dapat bekerja dengan andal, jadi itulah metode yang saya pilih.
Sunting: Setelah menemukan bahwa kinerja masih tidak cukup baik di buffer yang sangat besar, saya menghabiskan banyak waktu untuk mengoptimalkan penggunaan dan alokasi cpu, mengukur peningkatan kinerja dengan built in Emacs profiler (
M-x profiler-start
). Namun, Emacs masih akan gagap dan menggantung ketika menggulir dengan cepat melalui buffer yang sangat besar. Menghapus fungsi jit-lock yang saya daftarkanjit-lock-register
akan menghilangkan kegagapan dan hang, tetapi profiling menunjukkan fungsi jit-lock selesai sekitar 8 ms yang seharusnya cukup cepat untuk pengguliran yang lancar. Menghapus panggilan kejit-lock-register
dan sebagai gantinya menggunakan pencocokan font-lock-keywords biasa menyelesaikan masalah.TLDR: Melakukan ini lambat dan akan gagap:
Melakukan ini dengan cepat dan tidak akan gagap:
sumber
dyalog-fontify-locals
.dyalog-fontify-locals-matcher
seharusnyamy-font-lock-matcher
dan salah satu yangend
seharusnyalimit
. Pokoknya, penemuan yang sangat menarik!gc-cons-threshold
jika Anda mengacaukan nilai internal semata-mata untuk meningkatkan waktu mulai, saya sarankan Anda gunakanemacs-startup-hook
untuk mengembalikannya setelah itu.