Como posso solucionar um Emacs muito lento?

41

Estou escrevendo um documento e tenho um problema com o desempenho do Emacs que acho que apareceu ontem. Não fiz alterações no meu arquivo init nem instalei novos pacotes.

O problema é que enquanto estou escrevendo, há um atraso muito perceptível entre pressionar as letras no teclado e fazê-las aparecer na tela. Às vezes, eu os assisto ainda imprimindo na tela depois de terminar de digitar a palavra.

Não sei se há outros problemas, exceto a velocidade da digitação (só posso supor que existem), mas não os notei.

O que pode causar esse problema?
É causado pelo Emacs ou é devido ao desempenho do meu pc? Geralmente, quais são as variáveis ​​que afetam o desempenho do Emacs?

A versão do meu Emacs é GNU Emacs 24.3.1

O principal modo ativo é:

  1. Látex

e os modos ativos menores são:

  1. Autocompletar
  2. Composição Automática
  3. Compressão automática
  4. Criptografia automática
  5. Cursor intermitente
  6. Nome do arquivo Sombra
  7. Bloqueio de fonte
  8. Global-Auto-Complete
  9. Global-Font-Lock Global-Hl-Line
  10. Número da linha
  11. Roda do mouse
  12. Shell-Dirtrack
  13. Show-Paren
  14. Smartparens
  15. Smartparens-Global
  16. Dica de ferramenta Transient-Mark
Adão
fonte
5
C-h mirá revelar o modo principal e todos os modos secundários ativos. Você pode desativar lentamente cada modo menor até localizar a causa. Pode ser o próprio modo principal, mas os modos secundários são os suspeitos mais prováveis. Sem especificar quais modos você está usando, qualquer um aqui ficaria esfaqueado no escuro com o que está acontecendo com o seu problema. Tenho uma situação rara que ocorre com algumas imagens especiais - por exemplo, quando alguém me envia algo com um símbolo de telefone ou outros símbolos especiais no iPhone - mas esse é um problema de desaceleração isolado causado por símbolos especiais.
lawlist
2
linum-modediminui o desempenho em buffers grandes. nlinum-modeescrito por Stefan é melhor para buffers maiores.
lawlist
O que está acontecendo no seu computador? Quanta memória está sendo usada? Qual é a atividade do seu processador e quais programas são responsáveis ​​pela maior parte de seu uso? O problema pode muito bem ser algum outro programa.
Dave
2
Acabei de publicar esta referência em outro tópico: gnu.org/software/emacs/manual/html_node/elisp/Profiling.html - este seria um bom começo. Além disso, um tiro no escuro: tente desativar o bloqueio de fonte gnu.org/software/emacs/manual/html_node/emacs/Font-Lock.html - este é o meu primeiro suspeito habitual (que geralmente ocupa a maior parte dos ciclos da CPU) )
Wwxvw
11
O grande número de sugestões nesses comentários mostra que essa pergunta é um pouco vaga. Eu reformulei o título para pedir instruções, em vez de uma solução. Eu também forneci uma resposta em conformidade. Faça uma nova pergunta depois de seguir essas instruções ou deixe um comentário se elas não estiverem claras.
Malabarba

Respostas:

64

O que pode causar esse problema? É causado pelo Emacs ou é devido ao desempenho do meu pc? Geralmente, quais são as variáveis ​​que afetam o desempenho do Emacs?

O Emacs tem cerca de 50.000 variáveis ​​internas e alguns milhares de pacotes externos com uma média de algumas dúzias de variáveis ​​cada, você não pode esperar que alguém responda a isso em um sentido geral. :-)

Você pode ver isso apenas olhando para o tópico de comentários em sua pergunta. Há meia dúzia de sugestões diferentes, todas igualmente válidas.

O que você pode fazer para identificar o problema?

Opção 1: desativar modos

Comece a desativar os modos secundários listados e veja qual deles resolve o problema de desempenho. Gostaria de começar com smartparens, auto-complete, line-numbere font-lock, em seguida, siga para baixo na lista.

"Eu não tive esse problema ontem" significa muito pouco, não confie nele demais. Basta começar a desativar os modos menores até que algo o resolva.

Se nenhum dos modos secundários resolver seu problema, comece a comentar partes do seu arquivo init até descobrir qual trecho estava causando isso. De qualquer forma, faça uma nova pergunta quando tiver algo mais específico.

Opção 2: O criador de perfil

  1. Invocar M-x profiler-start RET RET(o segundo RETé confirmar cpu);
  2. Digite alguns caracteres, de preferência um parágrafo inteiro ou mais;
  3. Invocar M-x profiler-report.

Isso fornecerá um buffer que descreve o tempo da CPU gasto por cada função. Bater TABem uma linha a expande para exibir as funções dentro dela. Navegue nesse buffer até descobrir qual função está demorando tanto tempo de CPU.

O que eu faço depois?

Depois de encontrar a função ou pacote ou trecho causando atraso, você pode (sem ordem específica):

  • Faça uma nova pergunta aqui sobre esse modo secundário específico (ou função ou snippet).
  • Relate um bug ao mantenedor do pacote.
    • Verifique os comentários na parte superior do arquivo de origem do pacote. Se ele contém um URL (especialmente no github), provavelmente existe um rastreador de problemas lá.
    • Alguns pacotes oferecem um comando como M-x PACKAGE-bug-report.
    • O email dele deve estar na parte superior do arquivo de origem do pacote.
  • Se for um pacote interno, você poderá denunciá-lo M-x report-emacs-bug.
  • Mesmo para pacotes que não estão embutidos, você pode pedir ajuda na help-gnu-emacslista de discussão.
Malabarba
fonte
4
Essas são ótimas instruções. Muito obrigado! Como eu disse nos comentários da minha pergunta, eu não sabia que isso seria vago. Eu pensei que a resposta seria fundamental para alguém especialista em Emacs (como muitos de vocês são). De qualquer forma, este "guia" é ótimo e estou feliz que minha pergunta tenha levado a isso. :)
Adam
3
+100000 para usar o criador de perfil. Se você é bobo (como eu) e acidentalmente faz algo como adicionar uma chamada de função cara à linha de modo em cada buffer, essa é com certeza a maneira de descobrir o que está acontecendo.
Radon Rosborough
Como você desativa o modo secundário? Modos secundários ativados: Async-Bytecomp-Package Auto-Complete Auto-Compression Auto-Compression File-Name-Shadow Flycheck Flyspell 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 Substituir Org-Indent-Global Projectile Pyvenv Recentf Save-Place Shell-Dirtrack Show-Paren Show-Smartparens Mostrar-Smartparens-global Size-Indicação Smartparens Smartparens-global
Stryker