文件c++的写入性能

Write performance of a file c++

本文关键字:性能 c++ 文件      更新时间:2023-10-16

我需要用c++编写一个文件。内容是while循环中的标记,所以现在我一行一行地写。现在我在想,我可以节省变量中的所有内容,然后编写文件,从而提高编写时间。有人知道这两种方式中哪一种更好吗?

每一行都由以下函数编写:

void writeFile(char* filename, string value){
        ofstream outFile(filename, ios::app);
        outFile << value;
        outFile.close();
}
while(/*    Something   */){
   /*   something   */
   writeFile(..);
}

另一种方式是:

void writeNewFile(char* filename, string value){
    ofstream outFile(filename);
    outFile<<value;
    outFile.close();
}
string res = "";
while(/*    Something   */){
   /*   something   */
   res += mydata;
}
writeNewFile(filename, res);

您考虑过吗;

ofstream outFile(filename);
while(/*    Something   */){
   /*...*/    
   outFile<< mydata;
}
outFile.close();

outfile(流)是缓冲的,这意味着在将数据写入磁盘之前,它将在内部缓冲区(如字符串)中积累数据——除非您有非常特殊的要求,否则您不太可能做到这一点。

在第一种情况下,每次循环迭代都要关闭文件流并打开一个新的流,最好执行以下操作:

void writeFile(const std::string& value, std::ostream* os = nullptr) {
    if (os != nullptr) {
        os << value;
    }
}

或者:

void writeFile(const std::string& value, std::ostream& os) {
    os << value;
}

然后用您在另一个函数/main/whatever中创建的fstream对象(或第一种情况下的地址)调用它。

至于连续写还是最后写更快,这实际上取决于你在while循环中执行的计算类型,以及这会在多大程度上减缓整个过程。然而,出于可靠性原因,如果程序在while循环执行过程中因任何原因崩溃,有时最好连续写入,以避免丢失所有数据。

fstream对象已经被缓冲,因此添加到字符串中对您没有多大帮助,事实上,当超过之前分配的大小时,由于字符串内容的重新分配,甚至可能会失去性能。必须通过测试才能知道。