2011-12-24 28 views
11

मेरे पास 8 मेग फ़ाइल है। जेएक्सबी का उपयोग करके मार्शलिंग 1082ms लेता है, डीओएम का उपयोग करके 862 एमएमएस लेता है, सैक्स का उपयोग 438ms लेता है। यह जेडीके 1.6 के साथ सभी डिफ़ॉल्ट का उपयोग कर रहा है, वुडस्टॉक्स का उपयोग करने जैसी कोई अतिरिक्त कॉन्फ़िगरेशन का उपयोग नहीं किया जाता है।जेएक्सबी तेजी से

के प्रयास में, 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. मैं जेएक्सबी को तेज़ी से कैसे बदलूं? 2. मैं 100% कैसे सुनिश्चित कर सकता हूं कि अंतर्निहित पार्सिंग तंत्र क्या उपयोग कर रहा है?

उत्तर

2

मैंने इन्हें आजमाया नहीं है, लेकिन एक्लिप्ससेंक एक जेएक्सबी लागू करता है। http://www.eclipse.org/eclipselink/moxy.php जिब्क्स तेजी से माना जाता है, लेकिन मुझे लगता है कि यह एक जेएक्सबी कार्यान्वयन नहीं है। हालांकि यह वही काम करता है। http://jibx.sourceforge.net/index.html

यदि ग्रहण लिंक अनुपालनशील है, तो आप इसे केवल ड्रॉप करने और इसे आज़माने में सक्षम होना चाहिए। Jibx का परीक्षण करने के प्रयास के बारे में निश्चित नहीं है।

+0

EclipseLink MOXY (मैं तकनीक का नेतृत्व कर रहा हूँ) के लिए +1। मोक्सी जेएक्सबी 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/। जीबीएक्स एक जेएक्सबी कार्यान्वयन नहीं है। –

16

1 - मैं जेएक्सबी को तेज़ी से कैसे बदलूं?

आप एक स्थिर इनपुट से unmarshalling के साथ सही रास्ते पर हैं, लेकिन मैं XMLEventReader के बजाय XMLStreamReader की अनुशंसा करता हूं।

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

StAX के बाद से एक मानक आप इस तरह के WoodStox अंतर्निहित पार्सर के रूप में के रूप में एक और कार्यान्वयन में स्विच कर सकते हैं।

2 - मैं 100% कैसे सुनिश्चित कर सकता हूं कि यह अंतर्निहित पार्सिंग तंत्र का उपयोग कर रहा है?

बस जैसे आप कर रहे हैं। यदि आप एक JAXB कार्यान्वयन XMLStreamReader का उदाहरण देते हैं तो आप उचित रूप से सुनिश्चित कर सकते हैं कि इसका उपयोग किया जा रहा है। यदि दूसरी तरफ आप InputStream जैसे किसी चीज़ से अनारक्षित हो जाते हैं तो JAXB कार्यान्वयन जो भी पार्सिंग तकनीक चाहता है उसका उपयोग करने के लिए स्वतंत्र है। आप Woodstox साथ जाते हैं और साथ ही वहाँ प्रदर्शन पेज की जाँच करना न भूलें:

+1

धन्यवाद। आह तो मैं SAX के बजाय StAX का उपयोग कर रहा था। आप मानते हैं कि जेएक्सबी का उपयोग करने का सबसे तेज़ तरीका है? –

+0

नहीं, स्टैक्स दो प्रकार के पाठकों 'XMLStreamReader' और' XMLEventReader' प्रदान करता है। 'XMLStreamReader' विकल्प हमेशा तेज़ होता है। –

+0

हाँ मुझे वह मिलता है लेकिन मैं अपने मूल उदाहरण में SAX का उपयोग कभी नहीं कर रहा था। जिस तरह से आप सुझाव देते हैं वह लगभग 1800ms (लकड़ी के बिना) में आता है। सामान्य जेएक्सबी का उपयोग करने से अभी भी धीमा है। ऐसा क्यों है? –

संबंधित मुद्दे