Crie um Emacs 25 mínimo para testes de unidade

10

Gostaria de criar uma variante muito mínima do tronco do Emacs para testar a unidade do meu pacote Emacs Lisp. A compilação não precisa de GUI, suporte de imagem etc. Deve ser essencialmente apenas um intérprete mínimo do Emacs Lisp com as principais bibliotecas do Emacs Lisp e deve ser rápido , idealmente em menos de cinco minutos.

Atualmente, estou passando --with-x-toolkit=no --without-x --without-allpara ./configure. Após a conclusão, ele me diz que todos os recursos do Emacs estão desativados, mas infelizmente a compilação ainda leva quase dez minutos .

Entendo que pode ser impossível obter o Emacs compilado mais rapidamente, mas o que me faz pensar é que, com as mesmas bandeiras, o Emacs 24.5 constrói em apenas dois minutos .

Qual é o motivo dessa diferença grosseira e posso obter o tronco do Emacs para construir tão rápido quanto o Emacs 24.5?

E, em uma pergunta relacionada, como faço para que o Emacs construa silenciosamente? Atualmente, quase 80% da minha produção de teste unitário é do edifício Emacs. Idealmente, eu gostaria de ter make installimpressão nenhuma saída.

lunaryorn
fonte
Você está planejando fazer isso em algum tipo de plataforma de IC? Se não, que tipo de computador você está usando? Obviamente, a velocidade de compilação será muito dependente do seu processador, mas para mim ./configure --with... && make -j (number of cores * 1.5)termina em 30 segundos. Se você estiver executando em uma máquina local, use o argumento -j para fazer. Existe uma boa razão para você fazer make install? Isso adicionará um pouco de tempo que você poderia evitar se você apenas executasse o emacs a partir do diretório src.
21815 Jordon Biondo
É Travis CI, mas não vejo por que isso importa? É a diferença grosseira entre duas versões diferentes do Emacs na mesma máquina que eu gostaria de ter explicado. IOW por que o tronco cinco vezes mais para ser construído no mesmo sistema ?
lunaryorn
A construção de um repositório precisa criar certos arquivos, que já estão presentes nos tarballs distribuídos.
politza 17/07/2015
@politza Quais arquivos? Eu sei que preciso executar ./autogen.shpara gerar configure, mas isso é uma questão de segundos, não minutos.
Lunardorn 18/07
2
@ lunaryom Você tem três perguntas separadas aqui. 1: como criar o emacs rapidamente, 2: por que o emacs 25 é mais lento que o emacs 24.5 e 3: como make installexecutar silenciosamente. Portanto, divida-as em três perguntas para que elas possam ser rastreadas separadamente e edite-as de acordo com uma pergunta.
rochoso

Respostas:

8

A razão pela qual a 24.5 constrói tão rapidamente para você é que os .elcarquivos são realmente distribuídos no tarball, consulte make-dist . Ao criar a partir do git, a maior parte do tempo é gasta compilando os .elarquivos .elc. Ao otimizar o código C, a compilação Lisp pode ser mais rápida, mas ainda leva muito tempo. Compare os tempos de compilação usando as configurações originais (~ 14 vs ~ 1 minutos) com uma compilação usandoCFLAGS='-O2 -march=native' (~ 9 vs ~ 1,5 minutos).

Além disso, a clonagem do git leva cerca de um minuto, enquanto o download e a descompactação do tarball levam cerca de 5 segundos. Compare o tempo de compilação entre as versões ao baixar o arquivo git do github (~ 5, ~ 6, ~ 8 minutos para v24.5, master e emacs-25, respectivamente. Como você pode ver, quando não estiver usando um tarball de distribuição, todos os os tempos de construção são pelo menos a mesma ordem de magnitude (não sei por que o emacs-25 era mais lento que o mestre, poderia haver variação aleatória ou algum código obsoleto foi removido no mestre?).

E, em uma pergunta relacionada, como faço para que o Emacs construa silenciosamente? Atualmente, quase 80% da minha produção de teste unitário é do edifício Emacs. Idealmente, eu gostaria de ter make installimpressão nenhuma saída.

Você sempre pode redirecionar a saída para /dev/null. Nas minhas experiências, canalizei a make installsaída para grep -E '^(make|[A-Z])'reduzir a saída (o javascript do Travis CI que formata o log na Web estava tendo problemas com a saída completa).

posso obter o tronco do Emacs para construir tão rápido quanto o Emacs 24.5?

Não (ou sim, no sentido em que você pode obter o Emacs 24.5 para construir (quase) tão lento quanto o tronco do Emacs: p). Mas o que você pode fazer é salvar a compilação do Emacs e fazer o download desse resultado em cache para teste de unidade. Eu implementei isso no ramo de upload do meu fork do emacs-travis, aqui está um exemplo de uso pelo yasnippet : O tempo de instalação do Emacs é de ~ 2,5 segundos.

npostavs
fonte
3

Aqui estão várias sugestões.

  1. Nenhum arquivo elc.

Conforme declarado abaixo, a compilação de todos os arquivos lisp é responsável por pelo menos 10% do tempo. Uma maneira de desativar isso é editar o destino loaddefs no arquivo lisp/Makefilee alterá-lo para:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Nenhuma otimização do compilador ou tabelas de símbolos do depurador

Atualmente, estou passando --with-x-toolkit = no --without-x --without-all para ./configure.

Consegui reduzir o tempo de compilação C para 1/4 do tempo (de pouco menos de um minuto para 16 segundos) no src apenas alterando os sinalizadores de compilação padrão. O padrão CFLAGS eu fiquei tinha sido: -g -O3.

Então use em seu lugar CFLAGS=''.

  1. Não execute make install, apenas execute o emacs construído de dentro do diretório src .

Conforme declarado abaixo, outros 10% do tempo estão na criação de documentos. Embora eu não tenha cronometrado, não há dúvida de muito tempo copiando arquivos e compactando arquivos elisp make install. Então não. Se você deseja refazer os gráficos de tempo, execute remake --profile.

As observações acima são baseadas abaixo ....


O primeiro passo é entender onde é gasto o tempo para descobrir como reduzi-lo. Felizmente para algo como o Emacs, escrevi recentemente (ou melhor, estendi) uma ferramenta para ajudá-lo a descobrir. Eu adicionei uma --profileopção para refazer (um fork do GNU make) que lhe dirá quanto tempo é gasto em alvos específicos.

Eu tentei criar um instantâneo recente e sim, leva cerca de 10 minutos. Se você não tiver o remake instalado, eu tenho um resumo das informações de perfil que você pode usar na minha execução. Eu uso o kcachegrind para exibir as informações, mas pode haver outras ferramentas disponíveis para as ferramentas de visualização. Existe um png na essência, que é uma captura de tela da execução.

Agora para os detalhes ...

Na minha execução, cerca de 20% do tempo é gasto na construção de arquivos lisp e info que você realmente não precisa fazer. Na verdade, um pouco mais é gasto nos arquivos lisp do que nos arquivos info. Você provavelmente poderia alterar o Makefile para pular isso.

Pode ser interessante comparar com o emacs 24. Meu palpite é que o tamanho de ambos cresceu proporcionalmente.

Se houver interesse (que você pode mostrar por upvotes), sugerirei hacks específicos para o Makefile. No entanto, isso por si só deve ser suficiente para alguém motivado a trabalhar.

rochoso
fonte
"20% do tempo é gasto na construção de lisp" - clonei o repositório emacs-travis do @ lunaryorn que parece make lispestar levando em torno de 60% para o Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . E uma grande parte make srctambém está compilando lisp, então eu me pergunto como reconciliar essas medidas. No Emacs 24, parece que ele apenas compila cc-*.elarquivos durante make lisp, é um bug?
npostavs
Além disso, isso pode ser uma ilusão de ótica, mas parece-me que sua imagem de perfil representa apenas cerca de 50% do total.
npostavs
O remake do @npostavs apenas perfila o horário do destino, ele não se inclui. É possível e provável que, com todos os arquivos e diretórios no lisp, haja um tempo considerável gasto em "remake" / "make" no cálculo do que refazer. Além disso, mesmo que 'remake' seja uma bifurcação do make, então o que eles fazem é semelhante, para comparações mais próximas, você deve comparar os tempos da saída de perfil do remake com "remake" sem criação de perfil, não "make". E também com o mesmo remake / fazer versão por último, embora se pode tergiversar com a% 's e assim por diante, as sugestões gerais parecem aplicar-se utilizando seus dados..
rochoso
Além disso, estava usando minha medida, o CFLAGS=''que torna a compilação C mais rápida e a compactação de cifras mais lenta. Como se vê, o uso CFLAGS='-O2 -march=native'é mais rápido no Emacs 25, embora mais lento no Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs
@npostavs Você observa: a configuração de CFLAGS "torna a compilação C mais rápida e a compactação mais lenta." Mas se você estiver executando um único teste, não tenho certeza se o tempo geral: algum tipo de otimização C compilada / compilada + compilação LISP + LISP compilada + execução de teste LISP será menor que a compilação / compilação C não otimizada / não LISP teste de compilação + LISP.
rochoso