为什么tar | tar比cp快得多?


10

对于递归复制目录,使用tar打包目录,然后将输出传递到另一个目录以进行打包tar似乎比使用cp -r(或cp -a)快得多。

为什么是这样?为什么不能cp在引擎盖下以相同的方式使速度更快?

编辑:尝试复制包含数以万计的文件和文件夹的大型目录结构时,我注意到了这种差异,这些文件和文件夹深度嵌套,但总共只有50MB。不确定是否相关。


这是一个有趣的问题。您可以在此处找到一些答案:stackoverflow.com/questions/316078和此处:unix.stackexchange.com/questions/66647
Teresa e Junior

Answers:


6

Cp在所有文件中循环进行打开-读取-关闭-打开-写入-关闭。因此,从一个地方读取并向另一个地方写入会完全交错。Tar|tar可以在单独的进程中进行读取和写入,此外还tar使用多个线程“一次”读取(和写入)多个文件,从而有效地使磁盘控制器可以一次获取,缓冲和存储许多数据块。总而言之,它tar允许每个组件有效地工作,同时cp将问题分解成分散的,效率低下的小块。


我们真的可以说所有cp实现都是如此吗?我们怎么知道那是真的?而且为什么会cp以这种低效的方式编写?任何文件复制的教科书实现都一次读取一个n个字节的缓冲区,然后在读取另外n个字节之前将它们写入磁盘。但是您是说cp总是在写入整个副本之前先读取整个文件吗?
LarsH '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.