2011-12-24 27 views
11

Tengo un archivo de 8 Meg. La clasificación mediante JAXB lleva 1082 ms, usando DOM lleva 862 ms, y SAX tarda 438 ms. Esto usa todos los valores predeterminados con JDK 1.6, no se usa ninguna configuración adicional, como usar woodstox.Hacer que JAXB vaya más rápido

En un esfuerzo, para obtener un mejor rendimiento de JAXB, trato de hacer que use análisis SAX haciendo ...

FileReader fr = new FileReader("myfile.xml"); 
JAXBContext jc = JAXBContext.newInstance(MyObjectList.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 

XMLInputFactory xmlif = XMLInputFactory.newInstance(); 
XMLEventReader xmler = xmlif.createXMLEventReader(fr); 

long beginTime = System.currentTimeMillis(); 
MyObjectList obj = (MyObjectList)unmarshaller.unmarshal(xmler); 
long endTime = System.currentTimeMillis(); 

Esto hace que se vaya aún más lento - 3207ms.

Mis preguntas son: 1. ¿Cómo hago que JAXB vaya más rápido? 2. ¿Cómo puedo estar 100% seguro de qué mecanismo de análisis subyacente está utilizando?

Respuesta

2

No he probado estos, pero EclipseLink proporciona una implementación de JAXB. http://www.eclipse.org/eclipselink/moxy.php Se supone que Jibx es rápido, pero no creo que sea una implementación de JAXB. Aunque hace lo mismo. http://jibx.sourceforge.net/index.html

Si EclipseLink es compatible, entonces debería ser capaz de soltarlo e intentarlo. No estoy seguro sobre el esfuerzo de probar Jibx.

+0

+1 para EclipseLink moxy (Soy el plomo tecnología). MOXy es compatible con JAXB 2.1 y 2.2. Para obtener información sobre cómo usarlo como proveedor, consulte: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html. Asegúrese de revisar nuestra última versión 2.3.2: http://www.eclipse.org/eclipselink/downloads/. JiBX no es una implementación de JAXB. –

16

1 - ¿Cómo hago que JAXB vaya más rápido?

Está en el camino correcto con el desasignamiento de una entrada StAX, pero recomendaría un XMLStreamReader en lugar de un XMLEventReader.

XMLInputFactory xmlif = XMLInputFactory.newInstance(); 
XMLStreamReader xmler = xmlif.createXMLStreamReader(fr); 

Desde StAX es un estándar puede cambiar en otra aplicación, como WoodStox como el analizador subyacente.

2 - ¿Cómo puedo estar 100% seguro de qué mecanismo de análisis subyacente está utilizando?

Al igual que usted está haciendo. Si pasa una implementación de JAXB a una instancia de XMLStreamReader, entonces puede estar razonablemente seguro de que se está utilizando. Si, por otro lado, se desreglamentó de algo así como un InputStream, entonces la implementación de JAXB es libre de usar cualquier técnica de análisis que desee. Si vas con Woodstox asegúrese de comprobar que hay página de rendimiento, así:

+1

Gracias. Ah, entonces estaba usando StAX en lugar de SAX. ¿Cree que esa es la manera más rápida de usar JAXB? –

+0

No, StAX ofrece dos tipos de lectores 'XMLStreamReader' y' XMLEventReader'. La opción 'XMLStreamReader' es siempre la más rápida. –

+0

Sí, lo entiendo pero nunca utilicé SAX en mi ejemplo original. La forma en que sugieres entra a aproximadamente 1800ms (sin woodstox). Aún mucho más lento que el uso de JAXB normal. ¿Por qué es esto? –

Cuestiones relacionadas