Pourquoi tar | tar est-il tellement plus rapide que cp?

10

Pour copier récursivement un répertoire, utiliser tarpour emballer un répertoire puis rediriger la sortie vers un autre tarpour décompresser semble être beaucoup plus rapide que d'utiliser cp -r(ou cp -a).

Pourquoi est-ce? Et pourquoi ne peut-on pas cpfaire plus vite en le faisant de la même manière sous le capot?

Edit: j'ai remarqué cette différence en essayant de copier une énorme structure de répertoires contenant des dizaines de milliers de fichiers et de dossiers, profondément imbriqués, mais ne totalisant qu'environ 50 Mo. Je ne sais pas si c'est pertinent.

callum
la source
Voilà une question intéressante. Vous pouvez trouver des réponses ici: stackoverflow.com/questions/316078 et ici: unix.stackexchange.com/questions/66647
Teresa e Junior

Réponses:

6

Cpfait ouvrir-lire-fermer-ouvrir-écrire-fermer en boucle sur tous les fichiers. Ainsi, la lecture d'un endroit et l'écriture à un autre se produisent entièrement entrelacées. Tar|tarlit et écrit dans des processus séparés, et tarutilise en outre plusieurs threads pour lire (et écrire) plusieurs fichiers `` à la fois '', permettant ainsi au contrôleur de disque de récupérer, mettre en mémoire tampon et stocker de nombreux blocs de données à la fois. Dans l'ensemble, tarpermet à chaque composant de fonctionner efficacement, tout en cpdécomposant le problème en morceaux disparates et inefficaces.

Pum Walters
la source
Pouvons-nous vraiment dire que c'est vrai pour toutes les cpimplémentations? Comment savons-nous que c'est vrai? Et pourquoi serait cpécrit d'une manière si inefficace? Toute implémentation de manuel d'une copie de fichier lit un tampon de n octets à la fois et les écrit sur le disque avant de lire un autre n octets. Mais vous dites cptoujours lire tout le fichier avant d'écrire la copie entière?
LarsH