Pular para o conteúdo

Shell script para verificar comando + rápido.

Responder tópico
  • Denunciar
  • Indicar
01 02

13. Re: Shell script para verificar comando + rápido.

Enviado em 03/07/2023 - 12:36h

Cuidado com este tipo de construção (linha copiada diretamente da postagem orginal).

starter=$((time for ((i;i<5;i++)) ; { eval ${cmd} > /dev/null ; }) 2>&1) 


Ali o comando time está sendo usado para medir um bocado de coisas que serão executadas pelo próprio shell, a saber:

    • o redirecionamento “2>&1”, que felizmente acontece apenas uma vez;

    • o controle do laço de repetição “for ((i;i<5;i++))”, tanto na inicialização quanto em cada iteração;

    • o redirecionamento “> /dev/null”, que implica, em cada iteração do laço de repetição, duplicar a saída padrão (old_fd=dup(STDOUT_FILENO)), abrir o arquivo /dev/null (fd=open("/dev/null", O_WRONLY...), duplicar seu descritor (dup2(fd, STDOUT_FILENO)) e fechar o descritor original (close(fd));

    • o processamento da expressão passada ao comando eval em (“eval $cmd”) em cada iteração do laço de repetição;

    • se a expressão obtida acima for um comando externo, criar um processo filho (fork() ou clone(...)) e, dentro desse processo filho, disparar a execução do comando externo (execp(...); se o comando não for um pathname absoluto, ainda existem as etapas de procurar o comando nos diretórios listados na variável de ambiente PATH);

    • no processo original, desfazer o redirecionamento da saída padrão (dup2(old_fd, STDOUT_FILENO) e close(old_fd)) em cada iteração do laço de repetição;

    • em cada iteração do laço de repetição, esperar a conclusão do processo filho (waitpid() ou wait4()) e possivelmente processar dados da execução.

Se o comando cujo desempenho você quer avaliar for de execução muito rápida, o overhead relativo às operações do shell percebido pelo comando time pode ser bastante significativo. Se a sua necessidade de avaliar o desempenho desse programa requerer precisão, provavelmente você teria, no mínimo, de reduzir a quantidade de operações que ocorrem dentro do laço de repetição, mas muito possivelmente teria conseguir separar os tempos do próprio shell dos tempos do objeto da sua medição. Possivelmente nem mesmo usar o shell, mas construir seu cenário de testes em C.

Eu cheguei a mencionar essas preocupações na sua postagem sobre a cifra de César, lembra?


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

Responder tópico

01 02

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder