なぜ tar|tar は cp よりもはるかに高速なのでしょうか?

なぜ tar|tar は cp よりもはるかに高速なのでしょうか?

ディレクトリを再帰的にコピーする場合、 を使用してtarディレクトリをパックし、その出力を別のディレクトリにパイプして解凍する方が、 (または)tarを使用するよりもはるかに高速です。cp -rcp -a

これはなぜでしょうか? また、cp内部で同じ方法で実行しても、なぜ高速化できないのでしょうか?

編集: 深くネストされた数万のファイルとフォルダーを含む、合計で約 50 MB しかない巨大なディレクトリ構造をコピーしようとしたときに、この違いに気付きました。それが関係があるかどうかはわかりません。

答え1

Cpすべてのファイルに対して、オープン、読み取り、クローズ、オープン、書き込み、クローズのループを実行します。したがって、ある場所からの読み取りと別の場所への書き込みは完全にインターリーブされます。Tar|tar読み取りと書き込みは別々のプロセスで実行され、さらにtar複数のスレッドを使用して複数のファイルを「一度に」読み取り (および書き込み) できるため、ディスク コントローラは多くのデータ ブロックを一度に取得、バッファリング、および保存できます。全体として、tar各コンポーネントが効率的に動作し、問題を異なる非効率的な小さなチャンクに分割できますcp

答え2

編集は良い方向に進んでいます。cpは必ずしも より遅くなるわけではありませんtar | tar。 たとえば、ファイルの量とサイズによって異なります。 大きなファイルの場合、cpデータを移動するだけの単純な作業なので、プレーンが最適です。 小さなファイルがたくさんある場合は、ロジスティクスが異なり、tarより適している可能性があります。 たとえば、この答え

関連情報