c++频繁打开关闭iostream会影响IO性能吗?

c++ frequently open and close iostream will affect IO performance?

如果我想像logging功能一样频繁写入一个文件,哪种方法比较好?

  1. 当我需要写入时,打开 iostream,完成后关闭
void log(const string& s){
    iostream ios(log_path);
    ios << s;
    ios.close();
}
void main(){
    while (need_to_log) {
        log(some_string);
    }
}
  1. 在开始时将文件描述符保存为一些全局变量,在程序关闭时需要写入和关闭时使用它。
iostream ios(log_path);
void log(const string& s){
    ios << s;
}
void main(){
    while (need_to_log) {
        log(some_string);
    }
    ios.close();
}

这两者之间会有显着的性能差异吗?

是的,可能会有显着差异 – 如果日志记录是您的应用程序花费大部分时间的地方

打开和关闭文件需要系统调用。要关闭一个文件,特别需要刷新 ostream 的内部缓冲区,这需要另一个系统调用,并且可能还写入相对较慢的磁盘。

相比之下,如果保持流打开,operator<< 只会写入内存中的内部缓冲区,并且只有在缓冲区变满时才将其写出。这样效率更高,但也意味着您可能会看到文件中出现的日志行出现延迟。将 std::flush 发送到流中以便更早地刷新;请注意,写入 std::endl(而不是简单地 '\n')也会触发刷新。