Como comparar o bashrc / zshrc com o tempo de renderização do prompt?

5

Como estou experimentando novas coisas no meu prompt, preciso de uma maneira de saber qual é o impacto no desempenho.

Como posso monitorar quanto tempo demora para processar meu prompt e o tempo que leva para obter o. * rc?

    
por nifr 12.06.2013 / 13:30

1 resposta

3

Com este comando você deve ser capaz de comparar os tempos de inicialização, incluindo o fornecimento de arquivos rc (+ uma chamada de impressão, que não deve aumentar muito a sobrecarga):

time zsh -i -c "print -n"
time bash -i -c "echo -n"

Com mais de 1000 linhas no meu .zshrc , isso leva 0,3 s na minha instalação do cygwin. E não, realmente não é uma máquina de ponta (iCore2Duo P8700).

Em relação ao tempo de renderização do prompt:

  • em bash , é possível usar os comandos time builtin. No entanto, não sei a possibilidade de processar $PS1 como um prompt.

  • em zsh é o contrário, com print -P $PS1 $RPS1 você pode processar com um comando de impressão. (man zshbuiltins: " [print] -P Efetuar uma expansão rápida"). Mas parece que o tempo não funciona com comandos embutidos. É por isso que eu juntei este aqui:

    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    overhead=$((cumul/100.))
    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      print -P $PS1 $RPS1
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    print $((cumul/100. - overhead))
    

    Primeiro, isso mede a sobrecarga que é causada pelos comandos date . Isso é feito 100 vezes para melhores estatísticas. Em seguida, o print -P $PS1 $RPS1 é incluído, também é executado 100 vezes e a sobrecarga determinada na primeira parte é subtraída. Invocações consecutivas mostram que você não pode confiar no dígito de 1 ms, mas o dígito de 10 ms parece confiável. Com um valor esperado na ordem de segundos que deve ser suficiente.

Mas, como @Michael Kjörling já mencionou em um comentário, o prompt deve render em nenhum momento. Então, você deve pensar em como otimizar seu prompt ou levar em conta que, na minha experiência, o tempo de renderização do prompt (como na sua pergunta) é apenas uma pequena parte da exibição do prompt tempo . (Eu falo aqui principalmente sobre o shell Z, mas eu assumo no bash que existem conceitos similares.) Porque existem outras funções que são executadas antes que o prompt seja exibido. Isto é o que vem imediatamente a minha mente:

  • precmd : Executado antes de cada prompt; use which precmd para ver o que é no seu caso
  • se você tiver a opção sharedhistory habilitada, o arquivo ~/.zsh_history (ou seja lá o nome que você tenha dado) será lido. Especialmente se o seu diretório home estiver em um sistema de arquivos remoto, um atraso significativo pode ser induzido. Eu também observo de vez em quando alguns segundos antes que o prompt seja exibido quando o servidor NFS está sobrecarregado.

Uma ferramenta para analisar os requisitos de tempo de programas externos / funções internas em detalhes é o módulo zsh/zprof , carregado por

zmodload zsh/zprof

De man zshmodules : "Quando carregado, o zsh / zprof faz com que as funções do shell sejam perfiladas. Os resultados de criação de perfil podem ser obtidos com o zprof        comando disponibilizado por este módulo. "

    
por 13.06.2013 / 12:08