Jak mogę rozwiązać problem bardzo wolnego Emacsa?

41

Piszę dokument i mam problem z działaniem Emacsa, który, jak myślę, pojawił się wczoraj. Nie wprowadziłem żadnych zmian w moim pliku init ani nie zainstalowałem żadnych nowych pakietów.

Problem polega na tym, że podczas pisania mam zauważalne opóźnienie między naciśnięciem liter na klawiaturze a wyświetleniem ich na ekranie. Czasami patrzę, jak nadal drukują na ekranie po zakończeniu pisania słowa.

Nie wiem, czy są inne problemy oprócz szybkości pisania (mogę się tylko domyślić, że są), ale ich nie zauważyłem.

Co może powodować ten problem?
Czy to spowodowane przez Emacsa, czy może z powodu wydajności mojego komputera? Zasadniczo jakie zmienne wpływają na wydajność Emacsa?

Wersja mojego Emacsa to GNU Emacs 24.3.1

Głównym aktywnym trybem jest:

  1. Lateks

a mniejsze aktywne tryby to:

  1. Autouzupełnienie
  2. Autoskład
  3. Auto-kompresja
  4. Automatyczne szyfrowanie
  5. Kursor mrugnięcia
  6. File-Name-Shadow
  7. Blokada czcionek
  8. Global-Auto-Complete
  9. Global-Font-Lock Global-Hl-Line
  10. Numer kolejki
  11. Kółko w myszce
  12. Shell-Dirtrack
  13. Show-Paren
  14. Smartparens
  15. Smartparens-Global
  16. Etykietka Transient-Mark
Adam
źródło
5
C-h mpokaże tryb główny i wszystkie mniejsze tryby, które są aktywne. Możesz powoli wyłączać każdy mniejszy tryb, dopóki nie wyśledzisz przyczyny. Może to być sam tryb główny, ale pomniejsze tryby są najbardziej podejrzanymi. Bez określenia, jakich trybów używasz, każdy tutaj po prostu dźgnąłby w ciemności, co się dzieje z twoim problemem. Mam rzadką sytuację, która występuje w przypadku niektórych specjalnych obrazów - np. Gdy ktoś przesyła mi e-mailem coś z symbolem telefonu lub innymi specjalnymi symbolami w iPhonie - ale jest to izolowany problem spowolnienia spowodowany przez specjalne symbole.
prawnik
2
linum-modespowalnia działanie dużych buforów. nlinum-modenapisane przez Stefana jest lepsze dla większych buforów.
prawnik
Co dzieje się na twoim komputerze? Ile pamięci jest używane? Jak aktywne jest twoje procesor i które programy są odpowiedzialne za większość jego użycia? Problemem może być jakiś inny program.
Dave
2
Och, właśnie opublikowałem ten odnośnik w innym wątku: gnu.org/software/emacs/manual/html_node/elisp/Profiling.html - to byłby dobry początek. Również strzał w ciemność: spróbuj wyłączyć blokadę czcionek gnu.org/software/emacs/manual/html_node/emacs/Font-Lock.html - to mój pierwszy podejrzany (który często słusznie zajmuje większość cykli procesora ).
wvxvw
1
Sama liczba sugestii w tych komentarzach pokazuje, że to pytanie jest nieco zbyt niejasne. Zmieniłem tytuł, by poprosić o instrukcje zamiast rozwiązania. Odpowiedziałem również odpowiednio. Po wykonaniu tych instrukcji zadaj nowe pytanie lub zostaw komentarz, jeśli nie były jasne.
Malabarba

Odpowiedzi:

64

Co może powodować ten problem? Czy to spowodowane przez Emacsa, czy może z powodu wydajności mojego komputera? Zasadniczo jakie zmienne wpływają na wydajność Emacsa?

Emacs ma około 50 000 zmiennych wewnętrznych i kilka tysięcy pakietów zewnętrznych średnio po kilkadziesiąt zmiennych, nie można oczekiwać, że ktoś odpowie na to w ogólnym sensie. :-)

Możesz to zobaczyć, patrząc na wątek komentarzy pod Twoim pytaniem. Jest tam kilka różnych sugestii, wszystkie jednakowo ważne.

Co możesz zrobić, aby wskazać problem?

Opcja 1: Wyłącz tryby

Rozpocznij wyłączanie wymienionych mniejszych trybów i sprawdź, który z nich rozwiązuje problem z wydajnością. Chciałbym zacząć smartparens, auto-complete, line-numberi font-lock, a następnie w dół listy.

„Wczoraj nie miałem tego problemu” znaczy bardzo mało, nie polegaj na nim zbyt mocno. Po prostu zacznij wyłączać drobne tryby, dopóki coś go nie rozwiąże.

Jeśli żaden z mniejszych trybów nie rozwiąże problemu, zacznij komentować fragmenty pliku init, dopóki nie dowiesz się, który fragment kodu to spowodował. W każdym razie zadaj nowe pytanie, jeśli masz coś bardziej konkretnego.

Opcja 2: profiler

  1. Wywołaj M-x profiler-start RET RET(drugi RETto potwierdzenie cpu);
  2. Pisz trochę, najlepiej cały akapit lub więcej;
  3. Invoke M-x profiler-report.

To da ci bufor opisujący czas procesora zajmowany przez każdą funkcję. Uderzenie TABw linię rozszerza ją, aby wyświetlić funkcje w niej zawarte. Poruszaj się po tym buforze, aż dowiesz się, która funkcja zajmuje tyle czasu procesora.

Co mam potem zrobić?

Gdy znajdziesz funkcję, pakiet lub fragment kodu powodujący opóźnienie, możesz (w określonej kolejności):

  • Zadaj tutaj nowe pytanie dotyczące tego konkretnego trybu pomocniczego (lub funkcji lub fragmentu kodu).
  • Zgłoś błąd do opiekuna pakietu.
    • Sprawdź komentarze na górze pliku źródłowego pakietu. Jeśli zawiera adres URL (specjalnie na github), prawdopodobnie jest tam moduł do śledzenia problemów.
    • Niektóre pakiety oferują polecenie takie jak M-x PACKAGE-bug-report.
    • Jego e-mail powinien znajdować się na górze pliku źródłowego pakietu.
  • Jeśli jest to pakiet wbudowany, możesz to zgłosić za pomocą M-x report-emacs-bug.
  • Nawet w przypadku pakietów, które nie są wbudowane, możesz poprosić o pomoc na help-gnu-emacsliście mailingowej.
Malabarba
źródło
4
To są świetne instrukcje. Dziękuję Ci bardzo! Jak powiedziałem w komentarzach mojego querta, nie wiedziałem, że będzie to niejasne. Myślałem, że odpowiedź będzie elementarna dla kogoś znającego się na Emacsie (podobnie jak wielu z was). W każdym razie ten „przewodnik” jest świetny i cieszę się, że moje pytanie do tego prowadzi. :)
Adam
3
+100000 za korzystanie z profilera. Jeśli jesteś głupi (jak ja) i przypadkowo zrobisz coś takiego, jak dodanie kosztownego wywołania funkcji do linii trybu w każdym buforze, jest to z pewnością sposób, aby dowiedzieć się, co się dzieje.
Radon Rosborough,
Jak wyłączyć tryb podrzędny? Włączone pomniejsze tryby: Async-Bytecomp-Package Auto-Complete Auto-Composition Auto-Compress Nazwa pliku-cień Flycheck Flyspell Font-Lock Global-Auto-Complete Global-Auto-Revert Global-Eldoc Global-Flycheck Global-Font-Lock Global -Git-Commit Global-Hl-Line Global-Hungry-Delete Global-Linum Line-Number Linum Magit-Auto-Revert Org-Bullets Org-Indent Override-Global Projectile Pyvenv Recentf Save-Place Shell-Dirtrack Show-Paren Show-Smartparens Pokaż-Smartparens-Global Wskaźnik wielkości Smartparens Smartparens-Global
Stryker