使fstream保持打开状态或在每次需要使用它时将其打开的效率更高?

时间:2018-09-07 14:47:09

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

我的问题是,什么是打开流然后在程序结束时关闭它,或者每次我想使用它时都打开它更好。 我举一个例子。 这是一个简单的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;
};

1 个答案:

答案 0 :(得分:0)

通常,您希望保持文件打开状态,因为如果用户以某种方式替换了文件,则程序可能会非常不满意。例如,查看将编辑保存到长时间运行的.bat或bash脚本后会发生什么情况。此外,打开和关闭文件还有速度问题。

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

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