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个问题想请教:
- 鉴于这些信息,您能想出一种更好的方法来优化速度吗?
- 通过 StAX-Woodstox 解析器的速度更快的原因可能是什么?
很可能在其他情况下,进行了不必要的初始化(比如构造工厂;或使用非常慢的服务自省)。
我认为没有比自己构造流 reader 更有效的替代方法,尽管 Woodstox 至少允许您直接传递 byte[]
而无需 ByteArrayInputStream
。这很可能不会产生很大的不同,但包装没有任何好处。
Aalto XML 可能更快:https://github.com/FasterXML/aalto-xml -- 物有所值。
我正在采用的项目是使用 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个问题想请教:
- 鉴于这些信息,您能想出一种更好的方法来优化速度吗?
- 通过 StAX-Woodstox 解析器的速度更快的原因可能是什么?
很可能在其他情况下,进行了不必要的初始化(比如构造工厂;或使用非常慢的服务自省)。
我认为没有比自己构造流 reader 更有效的替代方法,尽管 Woodstox 至少允许您直接传递 byte[]
而无需 ByteArrayInputStream
。这很可能不会产生很大的不同,但包装没有任何好处。
Aalto XML 可能更快:https://github.com/FasterXML/aalto-xml -- 物有所值。