¿Por qué tar | tar es mucho más rápido que cp?

10

Para copiar un directorio de forma recursiva, usar tarpara empaquetar un directorio y luego canalizar la salida a otro tarpara desempaquetar parece ser mucho más rápido que usar cp -r(o cp -a).

¿Por qué es esto? ¿Y por qué no se cppuede hacer más rápido haciéndolo de la misma manera debajo del capó?

Editar: Noté esta diferencia al intentar copiar una enorme estructura de directorios que contenía decenas de miles de archivos y carpetas, profundamente anidadas, pero con un total de solo unos 50 MB. No estoy seguro si eso es relevante.

callum
fuente
Esa es una pregunta interesante. Puede encontrar algunas respuestas aquí: stackoverflow.com/questions/316078 y aquí: unix.stackexchange.com/questions/66647
Teresa e Junior

Respuestas:

6

Cphace abrir-leer-cerrar-abrir-escribir-cerrar en un bucle sobre todos los archivos. Entonces, leer de un lugar y escribir en otro ocurre completamente entrelazado. Tar|tarlee y escribe en procesos separados, y además tarutiliza múltiples hilos para leer (y escribir) varios archivos 'a la vez', permitiendo efectivamente que el controlador de disco recupere, almacene y almacene muchos bloques de datos a la vez. En general, tarpermite que cada componente funcione de manera eficiente, al tiempo que cpanaliza el problema en fragmentos dispares e ineficientemente pequeños.

Pum Walters
fuente
¿Podemos realmente decir que eso es cierto para todas las cpimplementaciones? ¿Cómo sabemos que es verdad? ¿Y por qué se cpescribiría de una manera tan ineficiente? Cualquier implementación de libro de texto de una copia de archivo lee un búfer de n bytes a la vez y los escribe en el disco antes de leer otros n bytes. ¿Pero dice que cpsiempre lee el archivo completo antes de escribir la copia completa?
LarsH