首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Xerces C++统计/访问DOMNode孩子的最快方法

使用Xerces C++统计/访问DOMNode孩子的最快方法
EN

Stack Overflow用户
提问于 2012-07-18 21:58:27
回答 2查看 1.6K关注 0票数 2

我正在尝试找出计算Xerces C++ DOMNode对象的子元素数量的最快方法,因为我正在尝试优化使用Xerces 2.6 DOMParser的应用程序的性能。

似乎大部分时间都花在了计算和访问孩子上。我们的应用程序需要迭代文档中的每个节点,以便使用DOMNode::setUserData()将数据附加到文档中。我们最初使用DOMNode::getChildNodes()DOMNodeList::getLength()DOMNodeList::item(int index)来计算和访问子节点,但这些操作的开销相对较大。

当我们使用一种不同的方式调用DOMNode:: getFirstChild()来获取第一个子节点,并调用DOMNode::getNextSibling()来访问特定索引处的子节点或计算第一个子元素的兄弟节点的数量以获得子节点总数时,可以观察到性能有了很大的提高。

但是,getNextSibling()仍然是我们解析步骤中的一个瓶颈,所以我想知道是否有更快的方法来使用Xerces遍历和访问子元素。

EN

回答 2

Stack Overflow用户

发布于 2012-09-19 10:04:09

是的在我发布后不久,我添加了代码来存储和管理每个节点的子节点计数,这产生了很大的不同。相同的节点被重复访问,并且每次都会重新计算子节点计数。这是一个相当昂贵的操作,因为Xerces本质上是为该节点重新构建DOM结构以保证其活跃性。我们有自己的对象,它封装了Xerces DOMnode以及我们需要的额外信息,我们使用DOMNode::setUserData将我们的对象与相关的DOMNode关联起来,这似乎是最后一个剩下的瓶颈。

票数 0
EN

Stack Overflow用户

发布于 2020-09-11 16:28:27

DOMNodeList的问题是,它实际上是一个非常简单的列表,因此像lengthitem(i)这样的操作的O(n)开销可以在code中看到,例如这里的长度:

代码语言:javascript
运行
复制
XMLSize_t DOMNodeListImpl::getLength() const{
    XMLSize_t count = 0;
    if (fNode) {
        DOMNode *node = fNode->fFirstChild;
        while(node != 0){
            ++count;
            node = castToChildImpl(node)->nextSibling;
        }
    }

    return count;
}

因此,如果不希望在迭代时更改DOM树,就不应该使用DOMNodeList,因为访问O(n)中的项会使迭代成为O(n^2)操作--这是一个等待发生的灾难(例如,xml文件足够大)。

对于迭代来说,使用[DOMNode::getFistChild()][2]DOMNode::getNextSibling()是一个足够好的解决方案:

代码语言:javascript
运行
复制
DOMNode *child = docNode->getFirstChild();
while (child != nullptr) {
    // do something with the node
    ...
    child = child->getNextSibling();
}

这在O(n^2)中如预期发生。

人们也可以使用[DOMNodeIterator][3],但为了create it需要正确的DOMDocument,当需要迭代时,它并不总是在手边。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11543130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档