昨天, 朋友告诉我, 他们的文件管理器使用了 cp 命令的优化方法, 复制目录的速度 提升了好几倍. 听了大概的意思, 上午就看了一下cp 命令的代码, 找到了它的开发者 的做法:

先对一个源目录中的所有文件, 基于 inode 做一次排序, 再依次读取

coreutils 项目的 lib/savedir.h 里面定义了 savedir() 函数, 这个函数用于读取一个目录中的记录, 然后依照指定的方法排序, 现在支持的有

  • 基于文件名排序
  • 基于文件 inode 大小排序

src/copy.c::copy_dir() 函数里, 会先调用 savedir() 读取一下 源目录, 再依次复制.

这种优化算法, 对顺序读取的设备, 比如机械硬盘和光盘, 比较有效, 可以显著减少 读取次数, 提高缓存命中率.

附件