Вот небольшой фрагмент кода, который является узким местом после выполнения некоторых измерений:
//-----------------------------------------------------------------------------
// Construct dictionary hash set from dictionary file
//-----------------------------------------------------------------------------
void constructDictionary(unordered_set &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.
РЕДАКТИРОВАТЬ: Дополнительный вопрос для предлагаемых альтернатив: Будет ли любая альтернатива (за вычетом увеличения размеров буфера потока) означать, что я пишу синтаксический анализатор, который проверяет каждый символ на предмет новых строк? Мне нравится простой синтаксис потоков, но я могу переписать что-нибудь более мелкое, если мне нужно для скорости. Чтение всего файла в память - это жизнеспособный вариант, это всего около 2 МБ.
РЕДАКТИРОВАТЬ №2: Я обнаружил, что замедление для меня было из-за установленной вставки, но для тех, кто все еще заинтересован в ускорении построчного ввода-вывода файла, прочтите ответы здесь И посмотрите продолжение Мэттью М. по теме.