2011-12-24 38 views
11

私は8メガファイルを持っています。 JAXBを使用するマーシャリングには1082ms、DOMには862ms、SAXには438msかかる。これはJDK 1.6ですべてのデフォルトを使用しており、woodstoxを使用するなどの特別な設定は使用されません。努力の中でJAXBの高速化

、JAXBからより良いパフォーマンスを得るために、私はそれが実行して解析するSAXを使うようにしよう...

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

これは、それがさらに遅く行かせる - 3207ms。

私の質問は次のとおりです。 1. JAXBの高速化を行うにはどうすればよいですか? 2.どのような基本的な構文解析メカニズムを使用しているかを100%確かめることができますか?

答えて

2

私はこれらを試していませんが、EclipseLinkはJAXBの実装を提供しています。 http://www.eclipse.org/eclipselink/moxy.php Jibxは速いと思われますが、JAXBの実装とは思えません。それは同じことをしますが。 http://jibx.sourceforge.net/index.html

EclipseLinkが準拠している場合は、それをドロップして試すことができます。 Jibxをテストするための努力については不明です。

+0

+1。 MOXyはJAXB 2.1および2.2に準拠しています。プロバイダとして使用する方法については、http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.htmlを参照してください。最新の2.3.2リリースをチェックしてください:http://www.eclipse.org/eclipselink/downloads/。 JiBXはJAXB実装ではありません。 –

16

1 - JAXBをより高速化するにはどうすればよいですか?

StAX入力からのアンマーシャリングを正しく実行していますが、XMLEventReaderではなくXMLStreamReaderをお勧めします。

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

StAXには、あなたは、このような基本的なパーサなどWoodStoxとして別の実装に切り替えることができます標準ですので。

2 - どのような基本的な解析メカニズムを使用しているかを100%確認するにはどうすればよいですか?

あなたがやっているように。 JAXB実装にXMLStreamReaderのインスタンスを渡すと、そのインスタンスが使用されていることが合理的に確認できます。一方、InputStreamのようなものからアンマーシャリングした場合、JAXBの実装では、どのような構文解析手法を使用しても自由に使用できます。あなたがWoodstoxで行けばそこにもパフォーマンスのページをチェックしてください:EclipseLinkのMOXY(私はハイテクリードだ)のための

+1

ありがとうございます。ああ、私はSAXの代わりにStAXを使っていました。それがJAXBを使う最速の方法だと思いますか? –

+0

いいえ、StAXは2つのタイプのリーダー 'XMLStreamReader'と' XMLEventReader'を提供します。 'XMLStreamReader'オプションは常により高速です。 –

+0

ええ、私はそれを取得しますが、私は元の例ではSAXを使用していませんでした。あなたが提案する方法は約1800ミリ秒で(ウッドストックス無しで)来る。通常のJAXBを使用するよりもまだ遅いです。どうしてこれなの? –