这里有一段代码,在进行一些测试后发现它是一个相当大的瓶颈:
//-----------------------------------------------------------------------------
// 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()
实现的内容,但我并不完全理解它们。输入文件只是带有*nix行终止符的文本字符串。
编辑:后续问题针对被建议的替代方案: 除了增加流缓冲区大小之外,任何替代方案是否意味着我需要编写一个解析器来检查每个字符的换行符?我有点喜欢流的简单语法,但如果为了速度而必须重写某些更详细的东西,我可以这样做。将整个文件读入内存是可行的选择,它只有约2mb大小。
编辑#2:我发现我的速度减慢是由于集合插入,但对于那些仍然对逐行读取文件IO进行加速感兴趣的人,请阅读此处的答案并查看Matthieu M.关于此主题的延续。
unordered_map
比 Google 的sparsehash
慢了一个数量级,而且比 GNU 的std::map
快不了多少。 - Fred Foo