Por que o tar|tar é muito mais rápido que o cp?

Por que o tar|tar é muito mais rápido que o cp?

Para copiar recursivamente um diretório, usar tarpara compactar um diretório e depois canalizar a saída para outro tarpara descompactar parece ser muito mais rápido do que usar cp -r(ou cp -a).

Por que é isso? E por que não pode cpser mais rápido fazendo isso da mesma maneira nos bastidores?

Editar: notei essa diferença ao tentar copiar uma enorme estrutura de diretórios contendo dezenas de milhares de arquivos e pastas, profundamente aninhados, mas totalizando apenas cerca de 50 MB. Não tenho certeza se isso é relevante.

Responder1

Cpfaz open-read-close-open-write-close em um loop sobre todos os arquivos. Assim, a leitura de um lugar e a escrita para outro ocorrem totalmente intercaladas. Tar|tarfaz leitura e gravação em processos separados e, além disso, tarusa vários threads para ler (e gravar) vários arquivos 'de uma só vez', permitindo efetivamente que o controlador de disco busque, buffer e armazene muitos blocos de dados de uma só vez. Em suma, tarpermite que cada componente funcione de forma eficiente, ao mesmo tempo que cpdivide o problema em pedaços díspares e ineficientemente pequenos.

Responder2

Sua edição vai na boa direção: cpnão é necessariamente mais lenta que tar | tar. Depende, por exemplo, da quantidade e tamanho dos arquivos. Para arquivos grandes, uma planície cpé melhor, pois é um trabalho simples de enviar dados. Para muitos arquivos pequenos, a logística é diferente e tarpode funcionar melhor. Veja por exemploesta resposta.

informação relacionada