【问题标题】:Write performance of a file c++文件c ++的写入性能
【发布时间】:2016-04-07 17:26:11
【问题描述】:

我需要用 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);

【问题讨论】:

  • 文件 I/O 速度并不是一件容易尝试和优化的事情。当然,如果你的程序只是做了一些会减慢磁盘写入速度的无意义的事情(比如调用sleep 或类似的东西),那是一回事。但是,如果您编写的代码看起来不错,但磁盘写入速度仍然很慢,那么可能是您的磁盘本身很慢。

标签: c++ performance writefile


【解决方案1】:

你考虑过吗;

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

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

【讨论】:

  • 这个你可能知道,但严格来说接近是多余的。
【解决方案2】:

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

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 循环执行期间程序因任何原因而崩溃时丢失所有数据。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多