tar | tarがcpよりもはるかに高速なのはなぜですか?


10

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

どうしてこれなの?そしてcp、内部で同じようにそれを行うことによってなぜより速くすることができないのですか?

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


これは興味深い質問です。ここでいくつかの答えを見つけることができます:stackoverflow.com/questions/316078およびここ:unix.stackexchange.com/questions/66647
Teresa e Junior

回答:


6

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


それがすべてのcp実装に当てはまると本当に言えるでしょうか。それが真実であることをどうやって知るのですか?そして、なぜcpそのような非効率的な方法で書かれるのでしょうか?教科書のファイルコピーの実装は、一度にnバイトのバッファを読み取り、次のnバイトを読み取る前にそれらをディスクに書き込みます。しかしcp、コピー全体を書き込む前に、常にファイル全体を読み取ると言っているのですか?
LarsH 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.