Jon*_*Jon 11 c++ optimization file-io ifstream
这里有一些代码,在做了一些测量之后是一个相当大的瓶颈:
//-----------------------------------------------------------------------------
// 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();
}
Run Code Online (Sandbox Code Playgroud)
我正在读大约200,000字,这在我的机器上大约需要240毫秒.ifstream
这里使用效率高吗?我可以做得更好吗?我正在阅读有关mmap()
实现的内容,但我并不是100%理解它们.输入文件只是带有*nix行终止的文本字符串.
编辑:建议替代方案的后续问题:任何替代方案(减去增加流缓冲区大小)是否意味着我编写了一个解析每个字符的解析器?我有点像流的简单语法,但如果我需要速度,我可以重新写一些更细节的东西.将整个文件读入内存是一个可行的选择,它只有2mb左右.
编辑#2: 我发现对我的减速是由于设置插入,但对于那些仍然有兴趣加快逐行文件IO的人,请在这里阅读答案并查看Matthieu M.的关于这个主题的继续.
在我的系统上快速分析(linux-2.6.37,gcc-4.5.2,用-O3编译)表明I/O不是瓶颈.无论是使用fscanf
char数组后跟dict.insert()还是operator>>
在你的确切代码中,它都需要大约相同的时间(读取240k字文件需要155-160 ms).
更换gcc的std::unordered_set
用std::vector<std::string>
在你的代码下降执行时间45毫秒(fscanf
) - 55毫秒(operator>>
)对我来说.尝试分析IO并分别设置插入.
归档时间: |
|
查看次数: |
6664 次 |
最近记录: |