簡體   English   中英

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

[英]Performance of string streams versus file I/O streams in C++

我必須閱讀一個巨大的文本文件(> 200,000個單詞)並處理每個單詞。 我將整個文件讀入一個字符串中,然后將一個字符串流附加到該文件中以輕松處理每個單詞。 該方法是我使用<<直接輸入文件中的每個單詞並對其進行處理,但是比較這兩種方法在執行時間方面沒有任何優勢。 操作內存中的字符串是否比每次我需要一個單詞就需要系統調用的文件要快? 請提出一些性能增強方法。

如果您仍然要將數據放入字符串流,則將其直接從輸入流復制到字符串流可能會更快,更輕松:

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

buffer << infile.rdbuf();

但是, ifstream將使用緩沖區,因此雖然它可能比讀取字符串然后創建stringstream的速度更快,但它可能比直接從輸入流工作要快得多。

為了提高性能和減少復制,這是很難克服的(只要您有足夠的內存!):

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
}

由於涉及到緩存,因此不一定每次提取時都會進行系統調用。 話雖如此,通過解析單個連續的緩沖區,您在解析時可能會獲得略微更好的性能。 另一方面,您正在對工作負載進行序列化(先讀取整個文件,然后解析),然后可以並行化(並行讀取和解析)。

該字符串將被重新分配並復制很多次以容納200,000個單詞。 那可能就是花時間。

如果要通過添加來創建巨大的字符串,則應使用繩索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM