Os comandos em execução os tornam mais lentos?

35

Eu me encontrei usando o sinal -v para muitos aplicativos cada vez menos (especialmente para coisas triviais como tar e cp ). No entanto, quando eu fazia e, digamos, descompactava um arquivo grande, demorava mais do que quando eu não usava o sinalizador -v .

Suponho que isso ocorra porque o terminal precisa processar o texto e estou preenchendo o buffer que ele possa ter. Mas a minha pergunta é, isso faz com que o aplicativo seja executado mais lentamente ou seja concluído na mesma quantidade de tempo e o que estou vendo é o terminal tentando recuperar o atraso?

    
por n0pe 20.07.2011 / 18:59

5 respostas

29

Sim, a execução do verbose deixará seus aplicativos mais lentos.

Quanto depende da aplicação.

Toda impressão no terminal exigirá tempo de processamento extra. No caso de usar printf () ou qualquer uma das suas irmãs, isso é uma quantidade muito grande de processamento desperdiçado.

Além disso, o terminal tem que lidar com esses dados. Existe uma quantidade limitada de espaço de buffer entre o aplicativo e o terminal, e o canal IO bloqueará até que haja espaço suficiente no dito buffer para realmente produzir os dados. O aplicativo geralmente não poderá continuar enquanto esse bloqueio estiver ocorrendo. 1

Além disso, o ato de exibir o texto de depuração no terminal consumirá ciclos de processamento. Novamente, isso depende do aplicativo (a quantidade de depuração), do programa terminal (fontes usadas, efeitos, etc) e até mesmo do driver X windows em uso (aceleração de hardware, etc.).

O programa time pode ser usado para determinar com precisão quanto tempo um comando levou para ser executado. Executar o mesmo programa duas vezes no tempo, uma vez com a depuração e uma vez sem, mostrará a você a diferença. Eu sugeriria executar o comando uma vez antes de executar os testes para garantir que o armazenamento em cache seja o mesmo para as duas execuções de teste do comando. Você não quer distorcer os resultados fazendo com que a segunda execução seja muito mais rápida porque a maioria dos dados foi armazenada em cache pela primeira execução agora ...

1 No caso de uma aplicação multiencadeada, apenas o encadeamento que executa a saída de depuração irá realmente bloquear.

    
por 20.07.2011 / 22:31
8

Depende do aplicativo que você está executando. No entanto, em geral, podemos dizer que o verbose abrandará os aplicativos Linux mais comuns, já que eles devem sincronizar suas ações entre os limites de stdout e E / S ou processador.

    
por 20.07.2011 / 19:04
6

Usando yes como um caso de teste no OS X 10.7, parece que realmente importa se você imprime muita saída para o terminal, como seria de esperar.

Quantificando isso um pouco mais, corri yes por 5 segundos, em um caso imprimindo a saída para o terminal e salvando-a em um arquivo (com tee ), no outro caso fazendo o mesmo exceto redirecionando stdout to /dev/null :

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

Caso 1. fornece linhas 2371584 e caso 2. fornece linhas 136421376 ou 57 vezes mais. O 'desempenho' de yes (medido pela quantidade de linhas impressas por unidade de tempo) é, nesse caso, assim 57 vezes mais lento .

Uma nota aqui é que usei yes em conjunto com tee aqui, o que pode influenciar os resultados um pouco, mas acho que os resultados ainda são válidos.

Outra indicação de que o programa está lento é que rodando yes durante a saída para um terminal, o terminal usa cerca de 100% da CPU e yes apenas em torno de 37%, enquanto executa yes sem saída para um terminal usa o total de 100% (Isto é em uma máquina multi-core, então yes poderia usar mais CPU se fosse capaz, exceto que ela foi retardada pelo terminal).

    
por 21.07.2011 / 00:04
5

É fácil simplesmente responder sim, isso vai diminuir a velocidade do aplicativo. Mas uma resposta muito mais verdadeira é que não importa em 99% dos casos.

Se o seu aplicativo está fazendo algum tipo de trabalho que realmente leva algum poder de CPU, as chances de imprimir algumas linhas extras de texto na tela fazendo qualquer diferença são próximas de 0%.

Na verdade, você pode facilmente fazer o seu próprio julgamento: se o aplicativo está lançando uma imensa parede de texto, pode custar um pouco. Talvez.

    
por 20.07.2011 / 22:43
3

Um código detalhado é geralmente avaliado com uma instrução if e toda vez que ele passa o controle para um função de exibição quanto mais tempo demora, contexto pode ficar comutado, mais interrupções.

Mas isso depende, se você verbose code é um thread separado que está apenas verificando o estado de conclusão de tempos em tempos, a diferença é negligenciável.

Esta questão pode se beneficiar muito da contribuição de programadores experientes do stackoverflow. Sugiro mover:)

    
por 03.08.2011 / 13:57