2011-12-24 15 views
11

Ho un file da 8 Meg. Il marshalling con JAXB impiega 1082 ms, utilizzando DOM prende 862 ms, utilizzando SAX richiede 438 ms. Questo utilizza tutte le impostazioni predefinite con JDK 1.6, non viene utilizzata alcuna configurazione aggiuntiva come l'uso di woodtox.Fai andare JAXB più veloce

Nel tentativo, per ottenere prestazioni migliori da JAXB, cerco di farlo usare SAX parsing facendo ...

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(); 

Questo fa andare anche più lenti - 3207ms.

Le mie domande sono: 1. Come faccio a far andare JAXB più veloce? 2. Come posso essere sicuro al 100% del meccanismo di analisi che sta utilizzando?

risposta

2

Non ho provato questi, ma EclipseLink fornisce un'implementazione JAXB. http://www.eclipse.org/eclipselink/moxy.php Jibx dovrebbe essere veloce, ma non penso che sia un'implementazione JAXB. Sebbene faccia la stessa cosa http://jibx.sourceforge.net/index.html

Se EclipseLink è conforme, dovresti riuscire a rilasciarlo e provarlo. Non sono sicuro dello sforzo per testare Jibx.

+0

+1 per EclipseLink Moxy (io sono in vantaggio tecnologico). MOXy è compatibile con JAXB 2.1 e 2.2. Per informazioni su come utilizzarlo come provider vedi: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html. Assicurati di dare un'occhiata alla nostra ultima versione 2.3.2: http://www.eclipse.org/eclipselink/downloads/. JiBX non è un'implementazione JAXB. –

16

1 - Come faccio a far andare JAXB più veloce?

Sei sulla strada giusta con unmarshalling da un input StAX, ma vorrei raccomandare un XMLStreamReader invece di un XMLEventReader.

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

Da StAX è uno standard è possibile passare in un'altra implementazione come WoodStox il parser sottostante.

2 - Come posso essere sicuro al 100% del meccanismo di analisi che sta utilizzando?

Proprio come stai facendo. Se si passa un'implementazione JAXB a un'istanza di XMLStreamReader, è possibile essere ragionevolmente sicuri che sia in uso. Se invece ti allontani da qualcosa come lo InputStream, l'implementazione di JAXB è libera di utilizzare qualsiasi tecnica di analisi che desideri. Se si va con Woodstox essere sicuri di controllare là fuori pagina prestazioni pure:

+1

Grazie. Ah, quindi stavo usando StAX invece di SAX. Pensi che sia il modo più veloce per usare JAXB? –

+0

No, StAX offre due tipi di lettori 'XMLStreamReader' e' XMLEventReader'. L'opzione 'XMLStreamReader' è sempre la più veloce. –

+0

Sì, lo capisco ma non ho mai usato SAX nel mio esempio originale. Il tuo modo di suggerire arriva a circa 1800ms (senza woodstox). Ancora molto più lento rispetto all'utilizzo del normale JAXB. Perchè è questo? –