você está aqui: Home  → Arquivo de Mensagens

Maneiras diferentes de fazer a mesma coisa

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 14 de maio de 2013

No Linux existem maneiras diferentes de se fazer a mesma coisa e também vícios de programação que nos levam a realizar tarefas de maneira nem sempre muito eficiente.

Seguem alguns exemplos. O tempo de execução de cada um deles é medido com o comando time.

Criar um arquivo vazio

Criação de um arquivo vazio

  % time touch arquivo1.txt
  real    0m0.002s
  user    0m0.000s
  sys     0m0.000s
  > arquivo2.txt
  real    0m0.000s
  user    0m0.000s
  sys     0m0.000s

Busca de texto em arquivos

  $ time cat /etc/passwd | grep queiroz
  queiroz:x:1000:1000:Rubens Queiroz de Almeida,,,:/home/queiroz:/bin/bash
  
  real    0m0.003s
  user    0m0.000s
  sys     0m0.000s
  % time grep queiroz /etc/passwd
  queiroz:x:1000:1000:Rubens Queiroz de Almeida,,,:/home/queiroz:/bin/bash
  
  real    0m0.002s
  user    0m0.000s
  sys     0m0.000s

Isto é bastante comum. O comando cat é totalmente desnecessário para esta finalidade.

Zerar o conteúdo de um arquivo

  $ time cp /dev/null A.txt
  
  real    0m0.008s
  user    0m0.004s
  sys     0m0.004s
  $ time > A.txt
  
  real    0m0.007s
  user    0m0.004s
  sys     0m0.004s

O arquivo A.txt usado nos exemplos acima tinha o tamanho de 21 MB.

Como se pode ver, os exemplos acima ilustram maneiras de se fazer uma mesma tarefa, algumas delas consideradas mais eficientes (e inteligentes) do que as outras, mas em termos práticos, o ganho é de apenas alguns milésimos de segundos. É claro que sempre devemos buscar a maneira mais eficiente de se realizar uma tarefa, mas em termos práticos, os computadores mais poderosos dos dias atuais até permitem uma certa incompetência :-)



 

 

Veja a relação completa dos artigos de Rubens Queiroz de Almeida

Opinião dos Leitores

Hermes A. Borges
15 Mai 2013, 17:49
Curiosamente, em minha máquina o time cp /dev/null arquivo foi mais rápido do que o time > arquivo:

$ time cp /dev/null a

real 0m0.016s
user 0m0.000s
sys 0m0.008s

$ time > a

real 0m0.020s
user 0m0.004s
sys 0m0.008s

Explicações? :P
Ricardo Lino Olonca
14 Mai 2013, 17:53
Essa diferença podem parecer insignificante, mas em um script que trata com um número grande de arquivos essa diferença vai ficar gritante.

Um exemplo, tinha um script que tratava diariamente 60 arquivos de log do Squid, com cerca de 1Gb cada. Em um certo momento eu fazia uma soma da seguinte forma:


$ echo "2 + 10" | bc

Passei a usar o seguinte:

echo $((2 + 10))

A diferença, aqui, parece mínima, mas o meu script, que rodava em cerca de 5 horas, passo a rodar e 4. 20% de desempenho só nessa mudança. Consegui baixar o tempo para 1 hora fazendo processamento paralelo e outras coisas mais.
Luiz Pedro
14 Mai 2013, 17:48
cat comentario_anterior | sed 's/em linha de código/num shell interativo/'
Aí o cat de novo, mas dessa vez por puro vício mesmo! :)
Luiz Pedro
14 Mai 2013, 17:45
No caso do cat, eu acabo usando em alguns casos por razões de praticidade na criação dos pipelines de comandos.
Por exemplo, quando precisei tratar um arquivinho de log de uns 35 MB um dia desses, tive que usar um sed e um grep, fora os uniqs e sorts:

grep -E 'texto qualquer' arquivo | sed 's/XX/YY/'g | blá blá blá, etc...

Só que no desenvolvimento dos comandos, em linha de código, cometi uns erros nas expressões regulares, então tive que refazer o comando várias vezes. Mas era um log de 35MB, e isso acabava causando uma grande lentidão, fora que os erros mais sérios geravam muitas linhas, me atrapalhando duplamente. Aí, pra desenvolver as regexp, substituí por isso:

head arquivo | grep -E 'texto qualquer' | sed 's/XX/YY/'g | etc, etc...

Depois de resolvido tudo os pobrema, somente substituí o head pelo cat. Claro, no exemplinho aqui é fácil voltar o '<', mas numa estrutura mais complexa de greps, pastes e uniqs, só trocar cat por head e destrocar à medida que se torna necessário facilita minha vida.

E quando o comandinho vai pra um arquivo e é promovido a script ou programa, aí sim o cat desaparece, pois a chance de ele afetar mais o desempenho aumenta muito, especialmente em arquivinhos de alguns gigas! Só uso-o mesmo na necessidade de numerar as linhas, o famoso cat -n, que vejo poucas vezes ser citado.
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script