【问题标题】:What's more efficient to keep the fstream open or to open it every time it needs to be used?保持 fstream 打开或每次需要使用时打开它更有效?
【发布时间】:2018-09-07 14:47:09
【问题描述】:

我的问题是,在程序结束时打开流并关闭它,或者每次我想使用它时打开它更好。 我举个例子。 这是一个简单的 Looger 类:

class Logger
{
    Logger()
    {
         f.open("log.txt", std::ofstream::trunc);
    }

    ~Logger()
    {
         f.close();
    }
 public:
    static void log(const std::string& message)
   {
       static Logger l;
       l.f<< message<<'\n';
   }
 private:
 std::osftream f;
};

这样会更好吗?:

class Logger
{
    Logger()
    {
        f.open("log.txt", std::ofstream::trunc);
        f.close()
    }

    ~Logger()
    {
    }
 public:
    static void log(const std::string& message)
    {
       static Logger l;
       l.f.open("log.txt", std::ofstream::app);
       l.f<< message<<'\n';
       l.f.close();
    }
 private:
 std::osftream f;
};

【问题讨论】:

  • 打开和关闭文件是一项需要时间的操作(不是那么多,但可以衡量)。那么,不断打开和关闭文件的版本效率较低
  • 我怀疑保持打开状态是最快的,但唯一确定的方法是对其进行基准测试。此外,如果您想使用此日志来调试崩溃,您可能需要刷新。
  • 效率是需要争取的,但有时您需要较慢的方法。第二个优点是文件在写入日志之间关闭,您可能需要这种行为的原因有很多。例如,您可以删除该文件或将其移动到另一个位置,这样您就可以为接下来计划的任何实验提供一个漂亮、干净的日志。
  • 事实上,如果你使用logrotate 之类的东西,你可能应该保持文件打开(尽管它确实有选项来补偿如果程序这样做的话)
  • 这个问题没有明确的答案。这取决于您的效率衡量标准和可用资源(缓冲区内存、限制程序一次可以打开多少文件的配额等)与您的程序使用什么(同时打开多少文件流) 以及设备的性能和操作系统的缓存(例如,写入 RAM 驱动器比写入硬盘驱动器花费更少的时间,但消耗更多的系统内存)。

标签: c++ performance logging coding-style fstream


【解决方案1】:

一般来说,您希望保持文件处于打开状态,因为如果文件被用户以某种方式替换,您的程序可能会非常不高兴。例如,看看如果将编辑保存到长时间运行的 .bat 或 bash 脚本会发生什么。此外,打开和关闭文件也存在速度问题。

另一方面,对于开发期间的详细日志记录,日志文件状态在每条消息后关闭的好处,尽管任何级别的崩溃甚至可能阻止操作系统保存任何缓冲的内容,即使在它被 flush()ed 之后,并且其他一些工具可以在新的日志文件中轮换,这可能意味着这些好处是值得的,但仅限于日志记录。

另一方面,编写自己的日志文件循环并不是特别困难(关闭并使用下一个名称重新打开非常少 MB),保持文件打开的速度优势可能会使日志记录更具吸引力。

【讨论】:

  • 在每条日志消息后刷新输出会很好。通常,操作系统会在刷新后更新文件。
  • 通常,但不一定,它可能总是你真正想要的那一点输出!但我必须承认,这个问题比以前少了很多。
  • 什么操作系统在刷新后丢失数据?我能想到的唯一情况是操作系统崩溃。如果应用程序崩溃,操作系统(POSIX 系统)会保留缓冲区,直到将它们写入磁盘,尽管发生了崩溃。至于Windows,我不知道,但我希望它是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多