2017-06-14 78 views
1

我正在採用的項目是使用JaxB API將XML解組到Java對象。我們傳遞一個ByteArrayInputStream給Unmarshaller的,如:JaxB性能增強

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

現在我想找到方法來優化鑑於字節數組是非常小的這一過程的速度(默認JAXB需要大約1-5ms),但有一噸他們。我試圖傳遞給Unmarshaller不同的輸入,比如StAX,StAX-Woodstox解析器和StreamSource對象。

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

出大約5000次嘗試,StAX的Woodstox解析器出來已經執行比別人更好。

這裏是我要問兩個問題:

  • 鑑於這些信息,你能想到更好的辦法在速度方面進行優化呢?
  • 爲什麼通過StAX-Woodstox解析器可以獲得更好的速度,這可能是什麼原因?

回答

0

在其他情況下,很可能會進行不必要的初始化(如構建工廠;或使用非常慢的服務內省)。 我認爲沒有比自己構建流式閱讀器更高效的替代方案,儘管Woodstox至少允許您在不使用ByteArrayInputStream的情況下直接通過byte[]。這不會造成很大的差異,但沒有包裝的好處。

阿爾託XML可能更快:https://github.com/FasterXML/aalto-xml - 什麼是值得。