高效地将格式化后的内容写入文件

write formatted stuff into file efficiently

本文关键字:文件 格式化 高效      更新时间:2023-10-16

我在内存中有一个相当大的vector<string>,我想将每个string写入./log.txt,下面是我的操作方法:

ofstream ofs("./log.txt");
for (vector<string>::const_iterator cit = vec.begin(); cit != vec.end(); cit++) {
    char buf[30];
    sprintf(buf, "%st---@n", cit->c_str());
    ofs << buf;
}
ofs.close();

我关心磁盘I/O时间,它有效吗?我有更好的主意吗?

这里有一个混合的想法,利用了不需要格式化任何东西的事实:

 for ( /* as you have */ )
 {
     ofs.write(cit->c_str(), cit->size());
     ofs.write("t---@", 5);
 }

不要使用C迂回道。试试显而易见的

ofs << *cit << "t---@n";

这应该比您目前拥有的速度更快。我怀疑任何合理的手动调整都不会比库为你做的更快。为什么上面可以假设比你的代码更快:

  • 没有分析格式化字符串
  • 不复制到临时缓冲区
  • 不查找终止的'',因为std::string将知道其长度

最后一点还不适用于"t---@n";您也可以将其转换为std::string,从而可能获得一点额外的性能。"纯C++"代码更好的原因还有其他:

  • 没有缓冲区溢出的危险
  • 数据中嵌入的''字符没有问题

磁盘I/O应该不是问题,因为数据流是缓冲的。因此,在将这些字符串一次性写入文件之前,该实现将在内存中收集一些字符串。即便如此,它们也可能存储在操作系统管理的缓存中,以积累更大的大块。因此,磁盘应该只看到很少的巨大写入,这是非常有效的。

这是否有效更多地取决于流的实现,而不是代码。这是应该的。若你们需要一个更高效的流,你们可以实现一个。

然而,正如其他人所指出的,您的代码是不安全的。您应该使用C++流运算符或方法。