如何更快地为Trie结构构建我的C ++程序?

时间:2018-02-17 07:30:30

标签: c++ performance io

我正在使用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();
}

以下是分析运行的结果。

profiling data

2 个答案:

答案 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()的代码。

您阅读p1p2并立即将其与空格连接。这是低效的:它们被输入文件中的空格分隔,你分别读取它们,为它们分配内存,然后再将它们重新组合在一起。

假设输入文件的每一行都出现了三个字符串,我就这样读了:

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是缓慢的原因,但你很可能是错的。它可能是内存分配效率低下,语言环境转换,字符串操作过度使用等。只有剖析器的确凿证据才是获得优化进展的最安全方法。