0

我有一个相当大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, "%s\t---@\n", cit->c_str());
    ofs << buf;
}
ofs.close();

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

4

3 回答 3

2

Here's a hybrid idea, exploiting the fact that you don't really need to format anything:

 for ( /* as you have */ )
 {
     ofs.write(cit->c_str(), cit->size());
     ofs.write("\t---@", 5);
 }
于 2012-07-31T08:56:45.213 回答
1

不要使用 C 绕道。试试明显的

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

这应该比您目前拥有的更快。我怀疑任何合理的手动调整都会比图书馆为你做的更快。可以假设上述内容比您的代码更快的原因:

  • 不解析格式化字符串
  • 不复制到临时缓冲区
  • 不寻找终止'\0',因为 astd::string会知道它的长度

最后一点不适用于"\t---@\n"尚未;你也可以把它变成a std::string,以获得一点点额外的性能。“纯 C++”代码更好的原因还有其他原因:

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

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

于 2012-07-31T09:01:55.047 回答
0

这是否有效更多地取决于 ofstream 的实现而不是您的代码。这是应该的。如果您需要更高效的 ofstream,您可以实现一个。

但是,正如其他人指出的那样,您的代码是不安全的。您应该改用 C++ 流运算符或方法。

于 2012-07-31T09:08:38.513 回答