【问题标题】:STAX Parser - Inconsistent performance for the same input fileSTAX Parser - 同一输入文件的性能不一致
【发布时间】:2011-01-13 18:04:00
【问题描述】:

我正在使用 STAX 解析器来处理 xhtml 中的每个文本节点。该应用程序部署在 Unix 盒子中。解析操作在执行第一个实例时需要更多时间。当我第二次运行时,它花费的时间相对较少,在随后的调用中,它比第二次运行花费的时间要少得多,此后的结果几乎一致。下面是我正在使用的代码。不知道为什么解析相同输入所花费的时间不一致。请帮忙。

一次创建XmlInputFactory,(类级别的静态方法)

    static {
    if (xmlInputFactory == null) {
    xmlInputFactory = XMLInputFactory.newInstance();
    xmlInputFactory.setProperty(javax.xml.stream.XMLInputFactory.IS_NAMESPACE_AWARE, false);
    }
    }

执行不一致的解析代码给出不同的响应时间 相同的输入文件,

    private static void parse(String xhtmlInput) throws XMLStreamException {
    ByteArrayInputStream arrayInputStream = new ByteArrayInputStream      (xhtmlInput.getBytes(Charset.forName("UTF-8")));
    XMLStreamReader parser = xmlInputFactory.createXMLStreamReader(arrayInputStream);
    while (true) {
    int currentEvent = parser.next();
    if (currentEvent == XMLStreamConstants.CHARACTERS) {
        // Do operation
    } else if (currentEvent == XMLStreamConstants.END_DOCUMENT) {
    parser.close();
    break;
    }
    }
    }

【问题讨论】:

  • javax.xml.stream.XMLStreamReader
  • 不,那是API类。该类的实现是什么——查看“streamReader.getClass()”。它可能是 JDK 1.6 默认实现(Sun 的 SJSXP)或 Woodstox;或者如果你不走运,stax 参考实现......(不走运,因为它是错误的)
  • 这是目前使用的,com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl。有没有更好的我应该切换到的?
  • 是的,Woodstox (woodstox.codehaus.org) 是最常用的一种。您似乎正在使用默认的 Stax 实现 (Sun Sjsxp),这没问题,但 Woodstox 通常更快。
  • 我刚刚意识到 WoodStox 工厂(com.ctc.wstx.stax.WstxInputFactory 类)和 XMLStreamReader(com.ctc.wstx.sr.ValidatingStreamReader 类)无意中在我的代码中使用。在我的类路径中使用 jar “wstx-asl-3.2.1.jar”,尽管我不必为 WoodStox 编写不同的代码,但 WoodStox 的 Factory 和 XMLStreamReader 实例是动态创建的。那么在类路径中包含 WoodStox jar 就足够了吗?

标签: xml performance parsing stax


【解决方案1】:

在不知道它是哪种实现的情况下,这是一种猜测,但有两个常见原因可以让任何 Java 库或应用程序在一段时间后运行得更快:

  • JVM 本身对字节码进行即时编译,并在运行中对其进行优化。这称为 JIT 预热,并且发生得非常快(前 10 秒左右)
  • 读取文件时,底层操作系统通常会缓存正在读取的磁盘块——如果再次读取相同的内容,则不是从磁盘读取,而是从内存中的磁盘缓冲区读取。

这些也是幼稚的 java 测试基准给出无用结果的最常见原因:如果您不考虑两者(即预热测试一段时间,丢弃初始结果;并从内存而不是磁盘读取测试数据),结果毫无意义。

【讨论】:

  • com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl 被使用。
  • 好的,这是默认的JDK实现。根据我的其他评论,我推荐 Woodstox。
  • 我刚刚意识到 WoodStox 工厂(com.ctc.wstx.stax.WstxInputFactory 类)和 XMLStreamReader(com.ctc.wstx.sr.ValidatingStreamReader 类)无意中在我的代码中使用。在我的类路径中使用 jar “wstx-asl-3.2.1.jar”,尽管我不必为 WoodStox 编写不同的代码,但 WoodStox 的 Factory 和 XMLStreamReader 实例是动态创建的。那么在类路径中有 WoodStox jar 就足够了吗?正如您所说,我认为初始运行中不一致结果的行为应该是由于 JIT 造成的。
  • 是的,因为 jar 包含 META-INF/services 条目以将woodstox“注册”为 stax impl 就足够了。仅当不存在其他 impl 时才使用 JDK 默认值。如果有多个附加组件(使用任意一个),事情就会变得复杂;但是只有woodstox就可以了。建议升级到 3.2.9 左右。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多