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

10

Para copiar recursivamente um diretório, usar tarpara empacotar um diretório e 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 feito mais rápido, fazendo da mesma maneira sob o capô?

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.

callum
fonte
Essa é uma pergunta interessante. Você pode encontrar algumas respostas aqui: stackoverflow.com/questions/316078 e aqui: unix.stackexchange.com/questions/66647
Teresa e Junior

Respostas:

6

Cpabre-lê-fecha-abre-escreve-fecha em um loop sobre todos os arquivos. Portanto, ler de um lugar e escrever para outro ocorre totalmente intercalado. 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 ao controlador de disco buscar, armazenar em buffer e armazenar muitos blocos de dados ao mesmo tempo. Em suma, tarpermite que cada componente trabalhe com eficiência, enquanto cpdivide o problema em pedaços díspares e ineficientemente pequenos.

Pum Walters
fonte
Podemos realmente dizer que isso é verdade em todas as cpimplementações? Como sabemos que isso é verdade? E por que cpseria escrito de maneira tão ineficiente? Qualquer implementação de livro de cópia de um arquivo lê um buffer de n bytes de cada vez e os grava no disco antes de ler outros n bytes. Mas você está dizendo que cpsempre lê o arquivo inteiro antes de escrever a cópia inteira?
Larsh