字符串流与C ++中的文件I / O流的性能

时间:2010-11-04 17:48:49

标签: c++ file io

我必须阅读一个巨大的文本文件(> 200,000个单词)并处理每个单词。我将整个文件读入一个字符串,然后附加一个字符串流,以便轻松处理每个单词。方法是我使用<<直接从文件中输入每个单词并对其进行处理,但比较这两种方法并没有给我任何执行时间方面的优势。在内存中操作字符串比在每次需要单词时需要系统调用的文件更快吗?请提出一些性能增强方法。

4 个答案:

答案 0 :(得分:4)

如果您打算将数据放入字符串流中,那么直接从输入流复制到字符串流可能会更快更容易:

std::ifstream infile("yourfile.txt");
std::stringstream buffer;

buffer << infile.rdbuf();

ifstream将使用缓冲区,但是,虽然这可能比读取字符串更快,然后创建字符串流,但它可能没有比直接从输入流工作更快。

答案 1 :(得分:4)

对于性能和最小复制,这很难被击败(只要你有足够的内存!):

void mapped(const char* fname)
{
  using namespace boost::interprocess;

  //Create a file mapping
  file_mapping m_file(fname, read_only);

  //Map the whole file with read permissions
  mapped_region region(m_file, read_only);

  //Get the address of the mapped region
  void * addr       = region.get_address();
  std::size_t size  = region.get_size();

  // Now you have the underlying data...
  char *data = static_cast<char*>(addr);

  std::stringstream localStream;
  localStream.rdbuf()->pubsetbuf(data, size);

  // now you can do your stuff with the stream
  // alternatively
}

答案 2 :(得分:1)

涉及缓存,因此每次提取时都不一定会进行系统调用。话虽如此,通过解析单个连续缓冲区,您可能在解析时获得稍微好一点的性能。另一方面,您正在序列化工作负载(读取整个文件,然后解析),这可能是并行化的(并行读取和解析)。

答案 3 :(得分:1)

字符串将被重新分配并复制很多次以容纳200,000个单词。这可能是花时间的。

如果你想通过附加来创建一个巨大的字符串,你应该使用一根绳子。