我们正在编写一个解决拼字游戏的程序,整个程序必须在0.1s内执行。我们通过标准输入(耗时0.05s,是我们最大时间的一半)向代码中插入字典。我们使用以下函数将单词添加到字典中,每个单词持续0.1秒:
void Node::addWord(const char* word){
const char idx = *word - 'a';
if(!mChildren[idx]) mChildren[idx] = new Node(*word);
if(strlen(word) > 1) mChildren[idx]->addWord(word + 1);
else mChildren[idx]->setMarker(true);
}
void Trie::addDictionary(const vector<string>* aux){
auto length = aux->size();
Node* current = root;
for (size_t i = 0; i < length; i++) {
int len = aux->at(i).length();
if (len >= 3 && len <= DIM*DIM + 1) {
current->addWord(aux->at(i).c_str());
}
}
}
在这种情况下,DIM = 4(是Boggle的NxN板的尺寸),aux是一个向量,其中来自标准输入的所有数据都被转储。我们施加len>= 3的条件,因为我们只想要包含3个及以上字母的单词。
有什么办法可以提高这些函数的速度吗?
提高这些函数速度的最好方法是对它们运行一个分析器。我不会考虑这样优化代码,直到你运行一个分析器。
话虽如此,我的预测是,如果您运行分析器,您将发现运行时的很大一部分(如90%)将在new Node(*word)
中。与您正在执行的其他操作相比,堆分配是缓慢的。多慢?这取决于你的平台,这就是为什么你需要配置文件来找到热点。在一个平台上花费大量时间的事情,在其他平台上可能只花费很少的时间。
运行分析器,确定我的声明是否正确。如果它是正确的,那么我建议池分配节点,以减少必须发生的分配数量。