TL; DR Eu tenho uma quantidade tão grande de pacotes que está prejudicando meu tempo de inicialização. Se você não acredita que possa ser esse o caso, continue lendo.
O tempo de inicialização do meu Emacs é bem pequeno. Eu não uso use-package
, apenas ajustei toneladas de ganchos autoload
es para que quase todo o código seja adiado. Na realidade, a coisa toda é carregada em menos de meio segundo, apesar de parecer uma bagunça louca.
No entanto, com o tempo, notei que meu tempo de inicialização fica minuciosamente mais lento, inexplicavelmente. Eventualmente, chegou ao ponto em que o tempo de inicialização é ≥ 1 segundo. Eu finalmente tive o suficiente e descobri a raiz do problema. Finalmente, comentei meu ~/.emacs
arquivo inteiro e descobri que o tempo de inicialização ainda era ≥ 1 segundo. Na verdade, ele só tinha raspado ~ 0.2
segundos, às vezes até menos. Então eu tentei emacs -q
e descobri que o tempo de inicialização era ~ 0.1
segundos.
Ao examinar esta seção do manual Elisp, descobri por que emacs -q
estava reduzindo tanto o tempo de inicialização. Aparentemente, o emacs -q
Emacs impede três ações na inicialização:
- carregando seu arquivo init
- carregando seu
default.el
arquivo - chamando
package-initialize
Já descartamos meu arquivo init, pois comentar todo o processo ~/.emacs
não faz quase nada. Eu não uso um default.el
arquivo, então isso também é descartado. O que deixa package-initialize
como o culpado pelo desempenho atingido.
Por que package-initialize
consumir tanto tempo de inicialização? Essa foi a primeira pergunta que me fiz. Não estou carregando automaticamente tudo? Bem, sim. Mas esse é precisamente o problema.
Eu encontrei este post que explica que "ativar" pacotes consiste em ler arquivos de carregamento automático e definir caminhos de carregamento. Obviamente, isso implica em uma penalidade de E / S quando você possui muitos pacotes, porque possui muitos arquivos de carregamento automático para ler e muitos caminhos para definir. Infelizmente, sem isso, a tarefa de gerenciar carregamentos automáticos fica nas mãos do usuário. Em outras palavras, sem deixar package.el
rastrear o sistema de arquivos para carregar arquivos e caminhos automaticamente, eu mesmo precisaria gerenciar isso, o que poderia ser um processo tedioso e propenso a erros.
Eu preferiria não seguir esse caminho. Atualmente, tenho 116 pacotes, dos quais 107 do ELPA e 25 dos quais são dependências. Estou certo de que esse número enorme é o que está degradando tanto meu desempenho. Mas estou com um dilema porque não quero remover nenhum dos meus pacotes.
Existe algum remédio em tal situação para recuperar meu tempo de inicialização do raio?
Atualizar:
Iniciamos um novo tópico na emacs-devel
lista de discussão sobre alguns patches de Stefan Monnier (uma descrição desses patches está aqui ) para resolver esse problema. Qualquer pessoa é bem-vinda para testar seus patches e dar feedback.
Outra atualização:
Parece que Stefan Monnier não está mais interessado nesta questão ou não está recebendo minhas mensagens. Estou inclinado a acreditar no primeiro, o que é bom, embora eu apreciasse algum tipo de resposta dele, se esse for o caso. De qualquer forma, o código que ele produziu para esse problema até agora funciona muito bem. Os patches mais recentes dele podem ser encontrados aqui (para o Emacs 25.3) e aqui (para o ramo principal do Emacs).Eu vi boas melhorias no meu tempo de inicialização graças aos patches dele e estou em um ponto em que me sinto confortável com o meu tempo de inicialização, pois é o mais otimizado possível, sem cortar os recursos da minha personalização. Eu esperava que esses patches chegassem à linha principal do Emacs em algum momento, mas acho que eu (ou outra pessoa) teria que pegar a tocha agora, em vez de Stefan. Tivemos um pouco de dificuldade na lista de discussão sobre atribuição e licenciamento de direitos autorais. Inicialmente, fiquei desconfortável com isso, mas devido a alguns comentários de Richard Stallman e outros, a atribuição de direitos autorais pode não ser tão restritiva quanto eu pensava inicialmente. Além disso, pode ser possível eu comprometer meus trabalhos ao domínio público como alternativa à atribuição de direitos autorais.
De qualquer forma, obrigado Stefan pelos patches até agora! Espero que você continue desenvolvendo essas mudanças, mas se não, tudo bem e que eu possa continuar desenvolvendo em algum momento. Agradeço também a todos que ofereceram insights e contribuições para resolver esse problema.
Mais uma atualização:
Uau, parece que esse recurso finalmente chegou e estará no Emacs 27. Graças a Stefan Monnier!
use-package
é o caminho a percorrer para isso.