我正在使用C ++。
我的程序读取了20万行文本文件并构成了Trie结构。
我可以保存Trie或比现在更快吗? 以下是从文件读取数据并构建结构的函数的代码。
void buildDictionary(pTrie* root, string name) {
wifstream r_dic;
r_dic.imbue(locale("kor"));
r_dic.open(name,ios::binary);
if (r_dic.fail()) {
cout << name << " open failed" << endl;
exit(-1);
}
wchar_t wch[256];
wstring p1, p2;
while (r_dic >> wch >> p1 >> p2) {
pTrie* pt = (*root).insert(splitJamo(wch).c_str(), p1+L' '+p2);
pt->addArche(wch);
}
r_dic.close();
}
以下是分析运行的结果。
答案 0 :(得分:2)
您的个人资料输出表明要优化的第一个区域是文件读取。具体做法是:
wchar_t wch[256];
wstring p1, p2;
while (r_dic >> wch >> p1 >> p2) {
pTrie* pt = (*root).insert(splitJamo(wch).c_str(), p1+L' '+p2);
pt->addArche(wch);
}
重复读取三个字符串。 wch
被读入字符数组,但随后传递给splitJamo()
,后者返回wstring
,这需要内存分配。这可能有点慢,但我无法说明,因为您还没有显示splitJamo()
的代码。
您阅读p1
和p2
并立即将其与空格连接。这是低效的:它们被输入文件中的空格分隔,你分别读取它们,为它们分配内存,然后再将它们重新组合在一起。
假设输入文件的每一行都出现了三个字符串,我就这样读了:
wchar_t wch[256];
wstring p1p2;
while (r_dic >> wch && std::getline(r_dic, p1p2)) {
pTrie* pt = root->insert(splitJamo(wch), p1p2);
pt->addArche(wch);
}
这将p1和p2一起读取,这应该是一种改进。进一步的改进可能是使用getline()
一次读取整行,但我们无法看到splitJamo()
和insert()
的代码。
另请注意,我从c_str()
的第一个参数中删除了insert()
,因为我认为它可能需要wstring
,因此我们避免以这种方式构建新参数。但如果需要wchar_t*
,则可以放回c_str()
。
答案 1 :(得分:1)
关于软件性能断言的一般规则是:无论你猜测是程序性能问题的原因,你都错了。使用工具而不是猜测。
在性能优化领域,第一个使用的工具是分析器。选择一个,在其控制下运行程序,然后分析探查者关于热点的报告(询问SO是否难以掌握,这是预期的),根据探查者做出假设&#39;数据,根据假设更改您的程序,重新运行并重新测量,冲洗并重复,直到您对改进感到满意为止。
有许多分析器,集成到IDE中(在MS Visual Studio中,可能在XCode中使用),集成到操作系统(Linux perf
)或独立(英特尔VTune)。
据我所知,你怀疑IO是缓慢的原因,但你很可能是错的。它可能是内存分配效率低下,语言环境转换,字符串操作过度使用等。只有剖析器的确凿证据才是获得优化进展的最安全方法。