首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xalan的性能问题

xalan的性能问题
EN

Stack Overflow用户
提问于 2021-03-10 11:21:13
回答 1查看 282关注 0票数 0

下面的方法需要33秒(执行时间)来执行10000次迭代。CachedXPathAPI来自org.apache.xpath.CachedXPathAPI.我使用的是xalan-2.7.0.jar。请大家在这里帮忙,怎样才能缩短执行时间。如果我们增加了负载,比如说40000次迭代,那么执行就需要10分钟。从for循环调用整个方法readXMLData

代码语言:javascript
复制
public static Hashtable<String, NodeList> readXMLData(CachedXPathAPI cashedXPath, org.w3c.dom.Document doc, String nodePath, int nodeInstance) throws Exception
{
    
    Hashtable<String, NodeList> input = null;

    try
    {
        NodeList rowNodes = cashedXPath.selectNodeList(doc, nodePath);
        // NodeList rowNodes = XPathAPI.selectNodeList( doc, nodePath);
        if (rowNodes == null)
            return null;

        if (rowNodes.getLength() <= 0)
            return null;

        Element rowNode = (Element) rowNodes.item(nodeInstance);
        if (rowNode == null)
            return null;

        NodeList rowElements = rowNode.getChildNodes();
        if (rowElements == null)
            return null;

        input = new Hashtable<String, NodeList>();

        for (int elementIndex = 0; elementIndex < rowElements.getLength(); elementIndex++)
        {
            Node rowElement = rowElements.item(elementIndex);

            if (rowElement.getNodeType() == Node.ELEMENT_NODE)
            {
                Element elem = (Element) rowElement;
                String name = elem.getNodeName();

                if (elem.hasChildNodes())
                {
                    NodeList child = elem.getChildNodes();
                    if (child != null)
                    {
                        input.put(name, child);
                    }
                } else if (elem.hasAttributes())
                {
                    input.put(name, (NodeList) rowElement);
                }
            }
        }

        return input;

    } catch (TransformerException ex)
    {
        throw new Exception("readXMLData (TransformerException): " + ex.getMessage());
    } catch (Exception ex)
    {
        throw new Exception("readXMLData (Exception): " + ex.getMessage());
    }
    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 12:24:03

首先,我将使用HashMap --但是对方法Map (**)进行签名。

方法的签名表明您可能正在执行类似的操作(或者至少在循环中处理相同的nodePath )。

代码语言:javascript
复制
readXMLData(cashedXPath, doc, nodePath, 1);
readXMLData(cashedXPath, doc, nodePath, 2);
readXMLData(cashedXPath, doc, nodePath, 3);
readXMLData(cashedXPath, doc, nodePath, 4);
readXMLData(cashedXPath, doc, nodePath, 5);

如果是这样,那么第一个显而易见的事情是,selectNodeList代码被不必要地反复运行--对于一组具有相同nodePath的行节点,只需要运行一次。

代码语言:javascript
复制
NodeList rowNodes = cashedXPath.selectNodeList(doc, nodePath);

想必,这个调用必须击中文档的很大一部分--它评估XPAth的每一个匹配,即使您只使用第一个,所以文档中的匹配越多,这就越浪费。

或者,如果这并不重要,我将注释掉其他所有内容,看看这是否是您的全部处理时间的很大一部分。如果在剩下的代码中花费了大量的时间,那么也要做同样的事情,并将其分解。

另一个需要考虑的选择是,每次方法处理它保存在DOM中的一些数据的映射中的rowElements时,使用的内存有多大. (**)。如果要保留返回的内容--那么要保留对临时数据结构的引用--因此内存使用量会不断增加,这可能会导致大量垃圾收集.一个解决方案--可能是增加应用程序可以运行的内存大小。另一个可能是找出您真正需要的DOM,并将值保存在其中(例如,不是DOM结构,但可能是叶内容(但不是任何DOM对象),这样所有与XPath结果相关的临时结构都可以释放(和GC'd)。

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

https://stackoverflow.com/questions/66563718

复制
相关文章

相似问题

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