paulo1205
(usa Ubuntu)
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)