Bagaimana saya bisa memecahkan masalah Emacs yang sangat lambat?

41

Saya sedang menulis dokumen dan saya memiliki masalah dengan kinerja Emacs yang saya pikir baru muncul kemarin. Saya belum membuat perubahan pada file init saya atau menginstal paket baru.

Masalahnya adalah ketika saya sedang menulis, ada jeda yang sangat mencolok antara menekan huruf-huruf pada keyboard dan membuatnya muncul di layar. Terkadang saya melihat mereka masih mencetak di layar setelah saya selesai mengetik kata.

Saya tidak tahu apakah ada masalah lain selain kecepatan mengetik (saya hanya bisa menebak bahwa ada) tetapi saya belum menyadarinya.

Apa yang bisa menyebabkan masalah ini?
Apakah itu disebabkan oleh Emacs atau karena kinerja pc saya? Secara umum apa saja variabel yang mempengaruhi kinerja Emacs?

Versi My Emacs adalah GNU Emacs 24.3.1

Mode aktif utama adalah:

  1. Getah

dan mode minor aktif adalah:

  1. Lengkap Otomatis
  2. Komposisi Otomatis
  3. Kompresi Otomatis
  4. Enkripsi Otomatis
  5. Kedip-Kursor
  6. File-Nama-Shadow
  7. Font-Lock
  8. Global-Otomatis-Lengkap
  9. Global-Font-Lock Global-Hl-Line
  10. Line-Number
  11. Roda mouse
  12. Shell-Dirtrack
  13. Show-Paren
  14. Smartparens
  15. Smartparens-Global
  16. Tooltip Transient-Mark
Adam
sumber
5
C-h makan mengungkapkan mode utama dan semua mode minor yang aktif. Anda dapat secara perlahan menonaktifkan setiap mode minor hingga melacak penyebabnya. Ini bisa menjadi mode utama itu sendiri, tetapi mode minor adalah yang paling mungkin tersangka. Tanpa menentukan mode mana yang Anda gunakan, siapa pun di sini hanya akan menusuk dalam gelap apa yang terjadi dengan masalah Anda. Saya memiliki situasi langka yang terjadi pada beberapa gambar khusus - misalnya, ketika seseorang mengirimi saya sesuatu dengan simbol telepon atau simbol khusus lainnya di iPhone - tetapi itu adalah masalah pelambatan terisolasi yang disebabkan oleh simbol khusus.
hukum
2
linum-modememperlambat kinerja buffer besar. nlinum-modeditulis oleh Stefan lebih baik untuk buffer yang lebih besar.
hukum
Apa yang terjadi di komputer Anda? Berapa banyak memori yang digunakan? Seberapa aktif cpu Anda dan program mana yang bertanggung jawab untuk sebagian besar penggunaannya? Masalahnya mungkin beberapa program lain.
Dave
2
Oh, saya baru saja mengirim referensi ini di utas lain: gnu.org/software/emacs/manual/html_node/elisp/Profiling.html - ini akan menjadi awal yang baik. Juga, bidikan dalam kegelapan: coba nonaktifkan font-lock gnu.org/software/emacs/manual/html_node/emacs/Font-Lock.html - ini adalah tersangka pertama saya yang biasa (yang sering dibenarkan mengambil sebagian besar siklus CPU ).
wvxvw
1
Banyaknya saran dalam komentar ini menunjukkan bahwa pertanyaan ini agak terlalu kabur. Saya telah menulis ulang judul untuk meminta instruksi, bukan solusi. Saya juga telah memberikan jawaban yang sesuai. Silakan ajukan pertanyaan baru setelah Anda mengikuti instruksi tersebut, atau tinggalkan komentar jika tidak jelas.
Malabarba

Jawaban:

64

Apa yang bisa menyebabkan masalah ini? Apakah itu disebabkan oleh Emacs atau karena kinerja pc saya? Secara umum apa saja variabel yang mempengaruhi kinerja Emacs?

Emacs memiliki sekitar 50.000 variabel internal dan beberapa ribu paket eksternal rata-rata pada beberapa variabel masing-masing, Anda tidak dapat mengharapkan seseorang untuk menjawab ini secara umum. :-)

Anda dapat melihatnya hanya dengan melihat komentar di bawah pertanyaan Anda. Ada setengah lusin saran berbeda di sana, semuanya sama-sama valid.

Apa yang dapat Anda lakukan untuk menunjukkan masalah?

Opsi 1: Nonaktifkan mode

Mulailah menonaktifkan mode-mode minor yang Anda daftarkan, dan lihat mana yang memecahkan masalah kinerja Anda. Saya akan mulai dengan smartparens, auto-complete, line-numberdan font-lock, kemudian ikuti bawah daftar.

"Saya tidak memiliki masalah ini kemarin" artinya sangat sedikit, jangan terlalu bergantung padanya . Mulailah menonaktifkan mode kecil hingga sesuatu menyelesaikannya.

Jika tidak ada mode minor yang memperbaiki masalah Anda, maka mulailah mengomentari sebagian dari file init Anda sampai Anda mengetahui snippet mana yang menyebabkan ini. Dalam kasus apa pun, ajukan pertanyaan baru ketika Anda memiliki sesuatu yang lebih spesifik.

Opsi 2: Profiler

  1. Invoke M-x profiler-start RET RET(yang kedua RETadalah untuk mengkonfirmasi cpu);
  2. Lakukan pengetikan, lebih baik seluruh paragraf atau lebih;
  3. Invoke M-x profiler-report.

Itu akan memberi Anda buffer yang menggambarkan waktu cpu yang diambil oleh masing-masing fungsi. Menekan TABgaris akan memperluasnya untuk menampilkan fungsi di dalamnya. Arahkan buffer ini hingga Anda mengetahui fungsi mana yang menghabiskan banyak waktu CPU.

Apa yang harus saya lakukan setelahnya?

Setelah Anda menemukan fungsi atau paket atau snipet yang menyebabkan lag Anda dapat (tanpa urutan tertentu):

  • Ajukan pertanyaan baru di sini mengenai mode minor khusus (atau fungsi atau cuplikan).
  • Laporkan bug ke pengelola paket.
    • Periksa komentar di bagian atas file sumber paket. Jika berisi URL (khususnya di github), mungkin ada pelacak masalah di sana.
    • Beberapa paket menawarkan perintah seperti M-x PACKAGE-bug-report.
    • Surelnya harus di bagian atas file sumber paket.
  • Jika ini adalah paket bawaan, Anda dapat melaporkannya bersama M-x report-emacs-bug.
  • Bahkan untuk paket yang tidak built-in, Anda dapat meminta bantuan di help-gnu-emacsmilis.
Malabarba
sumber
4
Ini adalah instruksi yang bagus. Terima kasih banyak! Seperti yang telah saya katakan di komentar tentang pertanyaan saya, saya tidak tahu bahwa itu akan menjadi kabur. Saya pikir jawabannya adalah dasar untuk seseorang yang ahli di Emacs (seperti banyak dari Anda). Pokoknya "pemandu" ini hebat dan saya senang pertanyaan saya mengarah ke sana. :)
Adam
3
+100000 untuk menggunakan profiler. Jika Anda konyol (seperti saya) dan secara tidak sengaja melakukan sesuatu seperti menambahkan pemanggilan fungsi yang mahal ke baris mode di setiap buffer, ini pasti cara untuk mengetahui apa yang terjadi.
Radon Rosborough
Bagaimana Anda menonaktifkan mode minor? Diaktifkan mode minor: Async-Bytecomp-Package Auto-Complete Auto-Composition Auto-Compression File-Name-Shadow Flycheck Flyspell Font-Lock Global-Auto-Complete Global-Auto-Revert Global-Eldoc Global-Flycheck Global-Font-Lock Global -Git-Berkomitmen Global-Hl-Line Global-Lapar-Hapus Global-Linum Line-Number Linum Magit-Auto-Kembalikan Org-Peluru Org-Indent Override-Global Projectile Pyvenv Recentf Save-Place Shell-Dirtrack Show-Paren Show-Smartparens Show-Smartparens-Global Size-Indication Smartparens Smartparens-Global
Stryker