【问题标题】:Is glob (using a unique prefix) faster than readdir?glob(使用唯一前缀)是否比 readdir 快?
【发布时间】:2016-03-15 22:35:33
【问题描述】:

有一个包含许多文件的目录,我需要打开名为00343dde41bac11ef7020935ee3d* 的文件。我怀疑只有一个这样的文件。

我知道访问一个文件fopen (3) 比读取整个目录readdir (3) 更快。

是否可以假设使用glob (3) 会比简单地使用readdir (3) 和测试文件名要快得多(需要更少的磁盘访问)?还有一个更强有力的声明:我可以假设glob (3),在这种情况下只有一个文件匹配并且我的模式使用前缀,应该和fstat (3)一样快吗?

研究:

【问题讨论】:

  • 原始讨论来自github.com/vgough/encfs/issues/7 创建文件系统时,这很重要。我正在寻求一个适用于多个平台的权威答案,以免我提交在 Linux 上运行但在 OTHER_OS 上运行缓慢的代码。
  • 在 Mac 上,glob 使用 readdir,所以它不可能更快。

标签: c posix glob


【解决方案1】:

在 *NIX 系统上,只有一个内核接口可以访问目录内容:readdir()。在内核级别,*NIX 系统不支持任何类型的 glob 或模式,甚至不支持前缀匹配。仅支持目录内容的哑线性列表。

glob()(或类似的wordexp())是一个使用readdir() 库函数实现的库函数。最重要的是,它还必须使用 glob 表达式执行匹配。它不能比手动编码的readdir() 循环更快。

附:降低级别,在文件系统级别:磁盘上的目录条目通常不排序。因此,部分文件名查找的优化是不可能的。 (此外,大多数文件系统都忽略了用于对文件名进行编码的字符集。)

【讨论】:

  • 谢谢。哇哦,如果文件没有排序,我什至不能假设 fopen() 是 O(1)!
  • 对全名查找进行了优化,通常是通过散列。 (但实际上比这更复杂,因为 small/medium/large 目录的优化方式不同。)不要忘记文件名和文件是两个不同的东西:一个文件可以有多个名称。
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 2010-10-17
  • 2019-07-07
  • 2011-06-16
  • 1970-01-01
  • 2017-02-03
  • 2012-02-14
  • 2016-02-27
相关资源
最近更新 更多