JaxB 性能增强

JaxB performance enhancement

我正在采用的项目是使用 JaxB API 将 XML 解组为 Java 对象。我们将 ByteArrayInputStream 传递给 Unmarshaller,例如:

ByteArrayInputStream bais = new BytearrayInputStream(byte[]...)
unmarshaller.unmarshal(bais)

考虑到字节数组非常小(默认 JaxB 大约需要 1-5 毫秒),但是字节数组有很多,现在我想找到优化此过程速度的方法。我已尝试将不同的输入(如 StAX、StAX-Woodstox 解析器和 StreamSource 对象)传递给 Unmarshaller 以进行比较。

unmarshall(..XMLInputFactory -> XMLStreamReader(bais)..)
unmarshall(..XMLInputFactory2 ->XMLStreamReader(bais)..)
unmarshall(..StreamSource(bais)..)

经过大约 5000 次尝试,StAX-Woodstox 解析器的表现优于其他解析器。

这里有2个问题想请教:

很可能在其他情况下,进行了不必要的初始化(比如构造工厂;或使用非常慢的服务自省)。 我认为没有比自己构造流 reader 更有效的替代方法,尽管 Woodstox 至少允许您直接传递 byte[] 而无需 ByteArrayInputStream。这很可能不会产生很大的不同,但包装没有任何好处。

Aalto XML 可能更快:https://github.com/FasterXML/aalto-xml -- 物有所值。