Здесь немного кода, который является значительным узким местом после выполнения некоторых измерений:
//-----------------------------------------------------------------------------
// Construct dictionary hash set from dictionary file
//-----------------------------------------------------------------------------
void constructDictionary(unordered_set<string> &dict)
{
ifstream wordListFile;
wordListFile.open("dictionary.txt");
std::string word;
while( wordListFile >> word )
{
if( !word.empty() )
{
dict.insert(word);
}
}
wordListFile.close();
}
Я читаю ~ 200 000 слов, и это занимает около 240 мс на моей машине. Является ли использование ifstream
здесь эффективным? Могу ли я сделать лучше? Я читаю о реализациях mmap()
, но я не понимаю их на 100%. Входной файл представляет собой просто текстовые строки с завершением строки * nix.
EDIT: следующий вопрос для предлагаемых альтернатив: Любая альтернатива (минус увеличение размеров буфера потока) подразумевает, что я пишу парсер, который анализирует каждый символ для новых строк? Я вроде как простой синтаксис потоков, но я могу переписать что-то более nitty-gritty, если мне нужно для скорости. Чтение всего файла в память является жизнеспособным вариантом, это всего лишь около 2 Мб.
РЕДАКТИРОВАТЬ № 2: Я обнаружил, что замедление для меня было связано с установленной вставкой, но для тех, кто все еще заинтересован в ускорении создания строки по строке IO, пожалуйста, прочитайте ответы здесь И проверьте продолжение Matthieu M. по этой теме.