我在C ++中使用自定义语言解析器,并使用SWIG为PHP和Python创建了一个接口。它将AST暴露回目标语言。 它工作得很好,使用C ++ lib的PHP已经快了30%,但似乎瓶颈是树遍历。 在纯PHP中,打印结果所花费的时间是微不足道的,但是使用C ++库,这是脚本的大部分运行时。 现在我的AST的节点可以有“无限”数量的孩子(n-ary树)。 为了访问子节点,我创建了2个函数
Node* getChild(int i) {
return self->getChildren().at(i).get();
}
int getNumChildren() {
return self->getChildren().size();
}
所以PHP中的遍历就像这样
for ($i = 0; $i < $node->getNumChildren(); ++$i)
doSomething($node->getChild($i));
我一想到它就尝试使用std_vector.i SWIG模板,但它似乎没有帮助。 如果我修改我的代码以便它创建二叉树会有帮助吗?还是我还没有看到另一个问题? 如果需要,我可以提供更多代码。 感谢
编辑:看起来使用C ++ lib遍历的树比使用纯PHP实现(显然使用PHP数组存储子项)慢大约2倍 - 20秒对10秒