Почему tar|tar намного быстрее cp?

Почему tar|tar намного быстрее cp?

Для рекурсивного копирования каталога использование tarдля упаковки каталога и последующей передачи вывода в другой каталог tarдля распаковки, по-видимому, намного быстрее, чем использование cp -r(или cp -a).

Почему так? И почему нельзя cpсделать быстрее, сделав то же самое под капотом?

Редактировать: Я заметил эту разницу, когда пытался скопировать огромную структуру каталогов, содержащую десятки тысяч файлов и папок, глубоко вложенных, но в целом всего около 50 МБ. Не уверен, что это имеет значение.

решение1

Cpвыполняет открытие-чтение-закрытие-открытие-запись-закрытие в цикле по всем файлам. Таким образом, чтение из одного места и запись в другое происходят полностью чередующимися. Tar|tarвыполняет чтение и запись в отдельных процессах, и, кроме того, tarиспользует несколько потоков для чтения (и записи) нескольких файлов «одновременно», эффективно позволяя контроллеру диска извлекать, буферизировать и сохранять множество блоков данных одновременно. В целом, tarпозволяет каждому компоненту работать эффективно, при этом cpразбивая проблему на разрозненные, неэффективно маленькие фрагменты.

решение2

Ваше редактирование идет в правильном направлении: cpне обязательно медленнее, чем tar | tar. Зависит, например, от количества и размера файлов. Для больших файлов cpлучше всего подойдет plain, так как это простая работа по перемещению данных. Для множества маленьких файлов логистика другая и tarможет быть лучше. См. напримерэтот ответ.

Связанный контент