第一,缩短调用链
void stream_read_streambuf(std::istream& f, std::string& result) {
std::stringstream s;
s << f.rdbuf();
std::swap(result, s.str());
}
第二,减少重新分配
void stream_read_string_reserve(std::istream& f,
std::string& result)
{
f.seekg(0,std::istream::end);
std::streamoff len = f.tellg();
f.seekg(0);
if (len > 0)
result.reserve(static_cast<std::string::size_type>(len));
result.assign(std::istreambuf_iterator<char>(f.rdbuf()),
std::istreambuf_iterator<char>());
}
第三,更大的吞吐量——使用更大的输入缓冲区
in8k.open(filename);
char buf[8192];
in8k.rdbuf()->pubsetbuf(buf, sizeof(buf));
第四,更大的吞吐量——一次读取一行
void stream_read_getline(std::istream& f, std::string& result) {
std::string line;
result.clear();
while (getline(f, line))
(result += line) += "\n";
}
第五,再次缩短函数调用链
bool stream_read_string(std::istream& f, std::string& result) {
std::streamoff len = stream_size(f);
if (len == -1)
return false;
result.resize (static_cast<std::string::size_type>(len));
f.read(&result[0], result.length());
return true;
}