Como o Emacs consegue iniciar instantaneamente com muitos arquivos el?

11

Como todo Emacs'er saberá, atualmente estou sofrendo com minha extensa configuração de pontos-Emacs. Todos os meus pacotes estão dentro dos contêineres de use-package, e eu compilei todos os meus .el-files. Mesmo com isso, o Emacs inicia em 6,4 segundos e carrega o restante dos pacotes (cerca de 40) depois.

Eu estava pensando em outras maneiras de resolver o longo tempo de inicialização, então notei algo. O Emacs padrão (sem configuração do usuário) usa muitas .elbibliotecas, incluídas em todos os Emacs. Eles estão localizados em \shares\emacs\version number\lisp\.

Mesmo com muitos arquivos lisp, ele consegue começar em um segundo. Quando eu estava inspecionando os arquivos de muitos pacotes incluídos no Emacs padrão, não encontrei nada extraordinário que pudesse explicar por que o Emacs consegue iniciar dentro de um segundo. Alguém poderia me dizer como o Emacs gerencia isso, mesmo com milhares de .elarquivos?

ReneFroger
fonte
1
Você usa :defer tem suas use-packagedeclarações sempre que possível?
Lunaryorn 01/09/2015
7
Numerosas bibliotecas principais no Emacs são pré-carregadas no executável, através do mecanismo de despejo usado ao criar o Emacs, o que também dá a ilusão de que ele carrega muitas coisas incrivelmente rapidamente. Veja C-h i g (elisp) Building Emacsse você está interessado em aprender sobre isso.
ph15 phils
2
@phils: Seria ótimo se você pudesse expandir seu comentário para uma resposta, parece que o mecanismo de despejo ainda não foi mencionado no Emacs-SE.
paprika
e mina é 76s ..
Leu_Grady
páprica: Feito ..
phils

Respostas:

9

Alguém poderia me dizer como o Emacs gerencia isso, mesmo com milhares de arquivos .el?

O Emacs "gerencia" isso não carregando na inicialização, impedindo o carregamento do aplicativo principal. Isso, por sua vez, é o efeito de retornar o controle do teclado ao usuário mais rapidamente.

Mas quando é carregado? No primeiro uso dessa função, modo ou recurso.

Não diminui a velocidade? Sim, no primeiro uso. Essa é a troca. Deseja diminuir a velocidade na inicialização do emacs ou no primeiro uso.

Isso é perceptível? O carregamento no momento da inicialização parece demorar mais, pois outras bibliotecas principais também são carregadas. Mas, no primeiro uso, parece mais rápido, pois apenas esse recurso de subconjunto é carregado.

Então, por que alguém pegaria carga na inicialização? Como alguns não se importam em esperar para carregar todas as bibliotecas usadas com freqüência na inicialização, uma vez carregadas, todas as operações são executadas rapidamente depois disso.

Como posso escolher? Como Drew e outros apontaram em suas respostas a essa pergunta, você pode usar o carregamento automático e truques semelhantes para controlar. Mas a consideração mais importante deve ser o seu padrão de uso. Se você usa o emacs como vi, constantemente abrindo e fechando, sim, o tempo de inicialização se torna dolorosamente óbvio. Por outro lado, se você usar o emacs em execução o tempo todo, o tempo de inicialização de 1 segundo ou 1 minuto não será tão perceptível ou importante o suficiente para se importar.

Observe que você pode usar o modo em lote ou o Zile para inicialização instantânea enquanto estiver testando, executando ou usando o emacs como vi.

Minha preferência é carregar na inicialização para que quaisquer erros sejam detectados antecipadamente. Prefiro não ter que lidar com nenhum erro de carga durante um dia de trabalho, quando tenho inúmeros buffers, modos e estados de compilação ativos, juntamente com vários locais remotos gerenciados pelo TRAMP. A depuração de erros de carregamento automático nessas condições não é muito agradável.

Usuário Emacs
fonte
10

Muitas das bibliotecas incluídas não são carregadas quando você inicia.

Alguns comandos etc. são carregados automaticamente , o que significa que o Emacs os reconhece e sabe como carregá-los. Quando você tenta usar um comando que é carregado automaticamente, o Emacs carrega a biblioteca que o define, se ainda não tiver sido carregada.

Você pode criar seus próprios carregamentos automáticos, seja para seus próprios comandos ou em bibliotecas que você não escreveu. Consulte o manual Elisp, nó Autoload .

Desenhou
fonte
Tão conhecido como carregamento lento, presumo? Existe algum exemplo de como o carregamento lento é alcançado, que será carregado somente quando for chamado?
ReneFroger 01/09/2015
Não tenho certeza do que você está perguntando. Sim, você pode chamá-lo de carregamento lento. Existem exemplos e explicações no manual Elisp. Adicionar um cookie de carregamento automático ( ;;;###autoload) imediatamente antes de uma definição de comando em sua biblioteca é uma maneira de fornecer uma definição de carregamento automático, garantindo que sua biblioteca seja carregada quando alguém o invocar.
Desenhou
... mas leia o link manual para entender como / se esses cookies de carregamento automático são processados. O gerenciador de pacotes lida com eles para todos os pacotes ELPA. Caso contrário, você chamaria (autoload...)diretamente no seu arquivo init para registrá-los.
phils
Obrigado por ambas as respostas, ajudou muito a descobrir mais!
ReneFroger 4/09/15
9

Além das outras respostas (que explicam como a maioria das bibliotecas é realmente carregada somente sob demanda), também há o problema do pré-carregamento de muitas bibliotecas elisp principais no emacspróprio executável, o que fornece uma ilusão de que ele carrega um muitas coisas incrivelmente rapidamente.

Isso é conseguido executando uma versão chamada "bare" do Emacs (que é o que realmente foi compilado e que é totalmente funcional, mas contém apenas o interpretador elisp e outras funcionalidades principais escritas em C) e dizendo para carregar todas as bibliotecas elisp que devem ser pré-carregadas, antes de finalmente "despejar" o emacsbinário real com as bibliotecas incorporadas.

Este mecanismo é detalhado no manual elisp:
C-hig (elisp) Building Emacs RET

Se você mesmo compilou o Emacs, poderá experimentar esse processo e até despejar versões alternativas do executável final, se desejar (geralmente não recomendado, mas o recurso existe).

O temacsbinário compilado pode ser encontrado no srcdiretório e você pode comparar a diferença nos horários de início executando cada versão da seguinte maneira:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

No meu sistema, o primeiro leva ~ 4 segundos (durante o qual 111 bibliotecas elisp são carregadas), enquanto o último leva ~ 0,02 segundos.

phils
fonte
@Phils muito legais por fazer esse ponto.
Usuário Emacs