Diferença de desempenho entre stdin e argumento de linha de comando

9

Para alguns comandos, é possível especificar determinada entrada como stdin ou um argumento de linha de comando.

Especificamente, suponha que command consiga inserir stdin e um nome de arquivo como argumento de linha de comando, e command < myfile , cat myfile | command e command myfile podem produzir o mesmo resultado.

Por exemplo,

Quando o comando é sed :

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

Quando o comando é cat :

cat < myfile
cat myfile
  1. Eu queria saber se existem algumas regras gerais sobre performances, ou seja, qual deles é geralmente o mais eficiente, e qual o menor?
  2. O redirecionamento é sempre melhor que o pipe?
por Tim 22.07.2011 / 05:06

2 respostas

5

A sintaxe cat file | command é considerada um Uso inútil de Cat . De todas as suas opções, é preciso um desempenho porque ele tem que gerar outro processo no kernel. Por mais insignificante que isso possa parecer, a sobrecarga que as outras formas não têm. Isso foi abordado em questões como: Devo me importar com gatos desnecessários?

Entre as outras duas formas, praticamente não há diferenças de desempenho. STDIN é um nó de arquivo especial que o processo precisa abrir e ler como qualquer outro. Passar um nome de arquivo em vez de STDIN apenas abre um arquivo diferente.

A diferença estaria em quais recursos / flexibilidade você está procurando.

  • Passar o nome do arquivo para o programa significaria que o arquivo de entrada era procurado. Isso pode ou não importar para o programa, mas algumas operações podem ser aceleradas se o fluxo for procurado.
  • Conhecer o arquivo de entrada real permite que seu programa potencialmente grave nele. Por exemplo, sed -i para edição no local. (Nota: como isso tem que criar um novo arquivo nos bastidores, não é um ganho de desempenho em relação a outros redirecionamentos, mas é uma etapa conveniente.)
  • O uso de redirecionamentos de shell oferece a capacidade de concatenar vários arquivos ou até mesmo usar o redirecionamento de processos. sed [exp] < file1 file2 ou mesmo sed [exp] < <(grep command) . Detalhes deste caso de uso podem ser encontrados nesta pergunta: Substituição e tubulação do processo
por 22.07.2011 / 09:30
2
  1. Dado que command file apenas abre o arquivo e a partir daí funciona como se fosse stdin , há pouca diferença. Com o redirecionamento de shell você apenas abre o arquivo de antemão (o shell faz), ao contrário do próprio comando binário.

  2. Se estamos falando de cat file | command vs. command <file , o segundo é o preferido. Você não notará diferença significativa de desempenho entre os dois, mas o primeiro é desnecessariamente complicado (processo extra e buffer de memória compartilhada para o pipe, com throughput limitado). Além disso, você não pode seek (alterar a posição do ponteiro do arquivo arbitrariamente ) em um pipe, enquanto você pode em um arquivo comum. Alguns comandos podem usar um algoritmo mais eficiente quando seek -ing no arquivo de entrada é possível.

por 22.07.2011 / 06:52