我的内存中有一个非常大的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时间,它有效吗?我的想法更好吗?
答案 0 :(得分:2)
这是一个混合的想法,利用了你真的不需要格式化的事实:
for ( /* as you have */ )
{
ofs.write(cit->c_str(), cit->size());
ofs.write("\t---@", 5);
}
答案 1 :(得分:1)
不要使用C绕道而行。试试明显的
ofs << *cit << "\t---@\n";
这应该比你现在拥有的更快。我怀疑任何合理的手动调整都可以比图书馆为你做的更快。可以假设上述内容比代码更快的原因:
'\0'
,因为std::string
会知道其长度最后一点不适用于"\t---@\n"
;您可以将其转换为std::string
,以获得更多的额外性能。 “纯C ++”代码更好的原因还有其他原因:
'\0'
字符没有问题磁盘I / O应该不是问题,因为ofstreams是缓冲的。因此,在将它们一次写入文件之前,实现将在内存中收集许多这些字符串。即便如此,它们可能会存储在由您的操作系统管理的缓存中,以积累更大的数据。所以磁盘只能看到很少的大写,这非常有效。
答案 2 :(得分:0)
这是否有效取决于ofstream的实现而不是代码。这应该是这样的。如果你需要一个更有效的ofstream,你可以实现一个。
然而正如其他人所指出的,您的代码是不安全的。您应该使用C ++流运算符或方法。