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

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

Para copiar recursivamente un directorio, usar tarpara empaquetar un directorio y luego enviar la salida a otro tarpara descomprimir parece ser mucho más rápido que usar cp -r(o cp -a).

¿Por qué es esto? ¿Y por qué no se puede cphacer 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 contiene decenas de miles de archivos y carpetas, profundamente anidados, pero con un total de solo unos 50 MB. No estoy seguro si eso es relevante.

Respuesta1

Cpabre-lee-cierra-abre-escribe-cierra en un bucle sobre todos los archivos. De modo que la lectura de un lugar y la escritura en otro se producen totalmente intercaladas. Tar|tarrealiza lectura y escritura en procesos separados y, además, tarutiliza múltiples subprocesos para leer (y escribir) varios archivos "a la vez", lo que permite de manera efectiva que el controlador de disco obtenga, almacene en buffer y almacene muchos bloques de datos a la vez. En definitiva, tarpermite que cada componente funcione de manera eficiente y, al mismo tiempo, cpdivide el problema en partes dispares e ineficientemente pequeñas.

Respuesta2

Su edición va en la buena dirección: cpno es necesariamente más lenta que tar | tar. Depende, por ejemplo, de la cantidad y el tamaño de los archivos. Para archivos grandes cplo mejor es un formato simple, ya que es un trabajo simple de distribuir datos. Para muchos archivos pequeños, la logística es diferente y tarpodría funcionar mejor. ver por ejemploesta respuesta.

información relacionada