É possível armazenar em cache o binário externo em um script de shell?

0

Minha pergunta pode soar um pouco estranha, mas esta manhã eu li essa pergunta: Por que é "echo" muito mais rápido que o “toque”?
Eu entendo perfeitamente o conceito de função interna, mas gostaria de saber se você toma o mesmo exemplo:

#!/bin/bash (or any other shell if it's possible in another)
for file in 'find . -name "*.xml"';
do 
   touch $file; 
done

Existe alguma possibilidade de pré-carregar o touch para que você não precise usar o fork a cada vez que usá-lo e, então, tornar-se mais rápido?

    
por Kiwy 09.04.2014 / 09:50

2 respostas

1

Na prática, o kernel armazenará em cache o executável e qualquer arquivo necessário (por exemplo, bibliotecas) na RAM.

O shell não tem como fazer nada. Se for um programa externo, ele precisa ser executado. Unices (excluindo camadas de emulação unix como Cygwin) tendem a tornar o carregamento de um programa bastante eficiente, mas nunca será tão rápido quanto a execução de um comando interno.

Você pode economizar tempo agrupando as chamadas para touch . Primeiro, você nunca deve usar a substituição de comando na saída de find : isso não tem absolutamente nenhuma vantagem, mas várias desvantagens:

  • Ele será interrompido se você tiver nomes de arquivos contendo caracteres em branco ou globbing.
  • É mais lento, porque o primeiro find precisa completar sua passagem da árvore de diretórios e somente então o processamento é iniciado.
  • Ele usa mais memória para armazenar a saída de find .

Em vez de fazer um loop nos resultados, faça find executar o comando. find é projetado para esse tipo de uso.

find . -name "*.xml" -exec touch {} \;

Agora, como touch pode processar muitos arquivos de uma só vez, basta substituir \; por + e voilà, touch será chamado em lotes contendo o maior número de arquivos possível.

find . -name "*.xml" -exec touch {} +

Se você precisar de desempenho em um script de shell, os componentes internos sempre vencerão comandos externos, a menos que você esteja manipulando grandes quantidades de dados. Por exemplo, usar as construções de processamento de string do shell é muito mais rápido (e menos propenso a erros devido a problemas de cotação) do que chamar sed se você tiver uma linha de texto. Por outro lado, use sed ou outras ferramentas externas especializadas se você tiver milhões de linhas para processar.

Se você estiver criando novos arquivos, poderá substituir o uso de touch -- "$file" por : >"$file" . Não existe esse atalho para alterar a data de um arquivo existente para a hora atual.

Os shells têm alguns comandos internos que podem ser implementados como comandos externos, mas são internos para desempenho. echo é um excelente exemplo. Há também shells com builtins adicionais para uso em situações de resgate onde comandos externos podem ser quebrados, ou quando a tabela de processos está cheia, etc. Por exemplo, o zsh vem com o zsh/files module contém comandos como mkdir e mv , mas não touch . Sash tem -touch embutido.

    
por 10.04.2014 / 02:48
0
find . -name "*.xml" -print0 | xargs -0 touch

Saiba mais | xargs

    
por 09.04.2014 / 19:56