Loops: para vs while… além do básico. Diferenças sutis / prós / contras para o meu código? [fechadas]

0

Eu tenho escrito / refinado um código relativamente complexo para o ano passado, e aprendendo bash ao longo do caminho. Meu código é preenchido com funções que possuem loops while de vários níveis complexos. Eu recentemente estive aprendendo mais sobre loops for e além da semelhança de c ++ e sem dúvida mais fácil de seguir a sintaxe, estou querendo saber se existem vantagens / desvantagens em usar um versus outro?

Estou pensando principalmente em tempo de execução e compatibilidade com looping de vários níveis. Funções (5 no total) no meu script podem fazer uma iteração entre 10.000 e 800.000 vezes cada, e toda a manobra levando de 12 a 48 horas começa a terminar em uma máquina poderosa, então eu me preocupo com diferenças de tempo muito sutis, se confiáveis. Também estou interessado em quaisquer outras diferenças possíveis entre / por enquanto que não seriam mencionadas em um fórum / site típico devido à sua similaridade geral, mas que poderia afetar um código complexo de qualquer maneira. Por exemplo, se um deles conclui todos os processos (e libera memória) antes do loop e o outro não? Ou interação com programas c ++ chamados dentro de loops.

Aqui estão exemplos simplificados de duas das minhas estruturas de código de função para demonstrar as várias maneiras em que estou usando loops while:

um:

var1="1"; var1max=${length}
while IFG=read -r var1lineFULL; do
    var1line='echo ${var1lineFULL} | cut -f 1'
    var2="1"; var2max=${length2}
    while [ ${var2} -le ${var2max} ]; do
        sedvar='sed -n ${var2}p < file.txt'
        wait; <c++ executable command>
        <more commands (bash/c++), if statements, echoing, verbose options...>
        let var2=var2+1
     done
     let var1=var1+1
done < anotherfile.txt

dois:

var1="1"
var3="1"; var3max='cat thirdfile.txt | wc -l'
while [ ${var3} -le ${var3max} ]; do
     while IFS=read -r var3line; do
          wait; <fickle c++ executable command>
          <bash commands.. if, echo, awk, cut, etc.>
          let var3=var3+3
     done < thirdfile.txt
     let var1=var1+1
done

Espero que isso faça sentido o suficiente para seguir. Nota: esses loops funcionam. Eu tenho eles manipulados para fazer o loop exatamente da maneira que preciso para incrementar inteiros que determinam quantas vezes um loop é executado e separa o nome do arquivo da saída criada. Eles também criam MUITAS linhas de texto, que eu "3 & >" em logs de texto.

Então, o que você acha? Existe alguma razão para mudar para "for" quando não alteraria a colocação do incremento? Existe alguma razão para não? Haveria alguma diferença de horário?

    
por neurocoder 23.04.2016 / 21:48

1 resposta

1

Se você sabe, antes do loop, quantas repetições vai precisar, como iterar um número contável de arquivos estáticos para processar, você deve usar um loop for. É por isso que os loops são bons em fazer. Se você não tiver certeza, e o loop pode ser diferente com base no que acontece durante o processamento, como algum tipo de algoritmo de agregação iterativo que preenche um acumulador para um determinado valor ou um algoritmo de pesquisa que será excluído do loop quando encontrar o valor que está procurando, então use um loop while.

No seu caso, você deve usar um loop for porque você sabe quantas iterações e está apenas incrementando seu contador por um valor fixo.

    
por 23.04.2016 / 22:17