【问题标题】:Improving the performance in fopen/ fclose scenario提高 fopen/ fclose 场景中的性能
【发布时间】:2017-10-09 15:54:32
【问题描述】:

以下情况: 我正在一个巨大的程序中编辑一个方法,该方法经常被调用,但我不知道准确的频率(每次运行不同)。

现在我必须将日志记录添加到 txt 文件中,每次调用时打开/关闭文件对整个应用程序来说都是一个巨大的瓶颈。

让文件保持打开状态并不是一个真正的选择,因为我不知道它是否是对该函数的最后一次调用。

有没有办法在不修改调用站点的情况下加快速度?
我宁愿避免更改方法签名,因为当我们将工作与我的同事结合起来时会导致问题(这里没有工作版本控制)

【问题讨论】:

  • 所以,不要在每次调用时打开和关闭文件。当您的程序正常终止时,该文件将被刷新并关闭。您可能应该在每次记录调用之后使用fflush()(尽管这有一些开销)。但是不要打开/关闭每个呼叫——它太慢了。考虑追加模式——这可能是个好主意。您无需更改功能的接口;您只需在文件范围内创建一个static FILE *stdlog = 0; 变量,如果在您登录时指针为空,请打开文件。此后,使用stdlog 作为日志文件流。如果您不想冒险stdlog,请尝试log_fp
  • 在 20 世纪,没有有效的版本控制是一个愚蠢的错误(冒犯)。在 21 世纪,这是可笑的不专业。
  • @rakib_:stdio 已经有缓冲区。除非您有非常特殊的需求,否则没有理由为此重新实现缓冲。
  • 这可能是XY Problem。您实际上想要达到什么目的?给我们一个更广阔的画面。
  • 如果您使用的是基于 Unix 或 Linux 的系统,请考虑使用syslog()

标签: c performance c89


【解决方案1】:

保持文件打开。当您的程序调用exit 或从main 返回时,所有文件都将关闭(包括刷新任何挂起的缓冲区)。没有理由关心对日志函数的调用是否是“最后一次调用”。

【讨论】:

    【解决方案2】:

    除了 R.. 的 answer,您还可以捕获中断或终止信号并自行关闭文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多