STAX Parser - 同一输入文件的性能不一致

时间:2011-01-13 18:04:00

标签: xml performance parsing stax

我正在使用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;
    }
    }
    }

1 个答案:

答案 0 :(得分:3)

不知道它是哪个实现,这有点猜测,但是有一些原因导致任何Java库或应用程序在一段时间后运行得更快:

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

这些也是天真的java测试基准测试产生无用结果的最常见原因:如果你不考虑两者(即一段时间的热身测试,丢弃初始结果;从内存读取测试数据,而不是磁盘),结果没有意义。