我正在编写一个使用GPX files的应用程序,当使用QDomElement类读取大型XML文档时,我遇到了性能问题。包含数千个航点的GPS路径的文件可能需要半分钟才能加载。
这是我读取路径(路线或轨道)的代码:
void GPXPath::readXml(QDomElement &pathElement)
{
for (int i = 0; i < pathElement.childNodes().count(); ++i)
{
QDomElement child = pathElement.childNodes().item(i).toElement();
if (child.nodeName() == "trkpt" ||
child.nodeName() == "rtept")
{
GPXWaypoint wpt;
wpt.readXml(child);
waypoints_.append(wpt);
}
}
}
在使用Apple的Instruments分析代码时,我注意到QDomNodeListPrivate :: createList()负责大部分计算时间,并且它由QDomNodeList :: count()和QDomNodeList :: item()调用。
看起来这不是迭代QDomElement的子元素的有效方式,因为列表似乎是为每个操作重新生成的。我应该使用什么方法呢?
答案 0 :(得分:3)
我尝试了这个
void GPXPath::readXml(QDomElement &pathElement)
{
QDomElement child = pathElement.firstChildElement();
while (!child.isNull())
{
if (child.nodeName() == "trkpt" ||
child.nodeName() == "rtept")
{
GPXWaypoint wpt;
wpt.readXml(child);
waypoints_.append(wpt);
}
child = child.nextSiblingElement();
}
}
原来这是一个快15倍的因素。我可以通过使用SAX来更快地完成它,但现在这样做。
答案 1 :(得分:0)
您应该考虑使用 QT SAX而不是DOM。 SAX解析器通常不会将整个XML文档加载到内存中,并且在诸如你的
之类的情况下很有用