c++频繁打开关闭iostream会影响IO性能吗?
c++ frequently open and close iostream will affect IO performance?
如果我想像logging功能一样频繁写入一个文件,哪种方法比较好?
- 当我需要写入时,打开 iostream,完成后关闭
void log(const string& s){
iostream ios(log_path);
ios << s;
ios.close();
}
void main(){
while (need_to_log) {
log(some_string);
}
}
- 在开始时将文件描述符保存为一些全局变量,在程序关闭时需要写入和关闭时使用它。
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'
)也会触发刷新。
如果我想像logging功能一样频繁写入一个文件,哪种方法比较好?
- 当我需要写入时,打开 iostream,完成后关闭
void log(const string& s){
iostream ios(log_path);
ios << s;
ios.close();
}
void main(){
while (need_to_log) {
log(some_string);
}
}
- 在开始时将文件描述符保存为一些全局变量,在程序关闭时需要写入和关闭时使用它。
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'
)也会触发刷新。