【问题标题】:Performance of fopen vs statfopen 与 stat 的性能
【发布时间】:2010-04-15 16:36:55
【问题描述】:

我正在为嵌入式系统编写几个 C 程序,我们可以挤出的每一点性能都很重要。其中一部分是访问日志文件。在确定文件是否存在时,使用 open / fopen 和 stat 之间是否存在性能差异?我一直在使用 stat 假设它只需要对文件系统进行快速检查,而 fopen 在返回之前必须实际获得对文件的访问权限并操作内部数据结构。这有什么好处吗?

【问题讨论】:

  • 编写一个小程序来测试这一点非常容易,这是所有与性能相关的问题都应该做的。

标签: c file-io fopen


【解决方案1】:

stat 可能更好,因为它不必为实际读取文件分配资源。您不必调用 fclose 来释放这些资源,而且您还可以从缓存最近检查的文件中受益。

当它怀疑时,测试一下。计时一个大循环,使用每种方法检查 1000 个文件,并适当混合存在和不存在的文件名。

如果您有 statfopen 的源代码,您应该能够通读它并了解哪些需要更多资源。

【讨论】:

  • stat 在我们的嵌入式盒子上检查文件存在的性能实际上比 fopen 好 3 倍,我有点惊讶。感谢您的建议。
【解决方案2】:

stat() 不会创建任何用户端内存数据结构。无论您的缓存策略多么激进,stat 都不会尝试预读取文件的数据。我认为 stat() 是一个更安全的选择。

access() 怎么样?

【讨论】:

    【解决方案3】:

    如果您想在查询文件存在和打开文件方面挤出性能,请尽量减少fopenstat 的调用次数。对文件系统的调用应该比运行时为转换它所做的任何事情都要昂贵。

    【讨论】:

      【解决方案4】:

      对于仅测试文件是否存在,stat() 将优于 fopen()。

      但是,根据您的设置,使用 lstat() 代替 stat() 可能是值得的。

      【讨论】:

      • 当文件从不是符号链接时,stat 和 lstat 之间是否存在性能差异?
      • @JosephGarvin - 当文件从不是符号链接时,性能不应有任何明显差异。
      猜你喜欢
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2019-03-27
      • 2012-04-15
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多