Производительность потоков строк по сравнению с потоками файлового ввода-вывода в C ++ - PullRequest
1 голос
/ 04 ноября 2010

Мне нужно прочитать огромный текстовый файл (> 200 000 слов) и обработать каждое слово. Я читаю весь файл в строку, а затем присоединяю к ней поток строки, чтобы легко обрабатывать каждое слово. Подход заключается в том, что я непосредственно вводю каждое слово из файла, используя <<, и обрабатываю его, но сравнение обоих подходов не дает мне никаких преимуществ с точки зрения времени выполнения. Разве это не быстрее работать со строкой в ​​памяти, чем из файла, который требует системного вызова каждый раз, когда мне нужно слово? Пожалуйста, предложите несколько методов повышения производительности.

Ответы [ 4 ]

4 голосов
/ 04 ноября 2010

Для производительности и минимального копирования это трудно победить (если у вас достаточно памяти!):

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
}
4 голосов
/ 04 ноября 2010

Если вы все равно хотите поместить данные в поток строк, возможно, это будет немного быстрее и проще скопировать непосредственно из входного потока в поток строк:

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

buffer << infile.rdbuf();

Однако ifstream будет использовать буфер, поэтому, хотя это, вероятно, быстрее, чем чтение строки, а затем создание потока строки, оно может быть не быстрее, чем работа непосредственно из входного потока.

1 голос
/ 04 ноября 2010

Строка будет перераспределяться и копироваться очень много раз, чтобы вместить 200 000 слов.Это, вероятно, то, что занимает время.

Вы должны использовать веревку, если хотите создать огромную строку, добавив.

1 голос
/ 04 ноября 2010

Кэширование включено, поэтому он не обязательно делает системный вызов каждый раз, когда вы извлекаете. Сказав это, вы можете получить немного лучшую производительность во время разбора, анализируя один непрерывный буфер. С другой стороны, вы сериализуете рабочую нагрузку (чтение всего файла, затем анализ), который потенциально может быть распараллелен (чтение и анализ параллельно).

...