2011-12-24 32 views
11

Tôi có tệp 8 Meg. Marshalling sử dụng JAXB mất 1082ms, sử dụng DOM mất 862ms, sử dụng SAX mất 438ms. Điều này đang sử dụng tất cả các giá trị mặc định với JDK 1.6, không sử dụng cấu hình bổ sung nào như sử dụng woodstox.Làm cho JAXB đi nhanh hơn

Trong một nỗ lực, để có được hiệu suất tốt hơn từ JAXB, tôi cố gắng để làm cho nó sử dụng SAX phân tích cú pháp bằng cách làm ...

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

này làm cho nó đi thậm chí chậm hơn - 3207ms.

Câu hỏi của tôi là: 1. Làm cách nào để làm cho JAXB hoạt động nhanh hơn? 2. Làm thế nào tôi có thể chắc chắn 100% cơ chế phân tích cú pháp cơ bản mà nó đang sử dụng?

Trả lời

2

Tôi chưa thử, nhưng EclipseLink cung cấp triển khai JAXB. http://www.eclipse.org/eclipselink/moxy.php Jibx được cho là nhanh, nhưng tôi không nghĩ rằng nó thực hiện JAXB. Mặc dù nó làm điều tương tự. http://jibx.sourceforge.net/index.html

Nếu EclipseLink tuân thủ, thì bạn có thể chỉ cần thả nó vào và dùng thử. Không chắc về nỗ lực kiểm tra Jibx.

+0

+1 cho EclipseLink MOXY (Tôi là người dẫn đầu công nghệ). MOXy tương thích với JAXB 2.1 & 2.2. Để biết thông tin về việc sử dụng nó như nhà cung cấp của bạn, hãy xem: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html. Hãy nhớ xem bản phát hành 2.3.2 mới nhất của chúng tôi: http://www.eclipse.org/eclipselink/downloads/. JiBX không phải là triển khai JAXB. –

16

1 - Làm cách nào để làm cho JAXB hoạt động nhanh hơn?

Bạn đang đi đúng hướng với việc không sửa đổi từ đầu vào StAX, nhưng tôi khuyên bạn nên sử dụng XMLStreamReader thay vì XMLEventReader.

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

Vì StAX là tiêu chuẩn bạn có thể chuyển sang triển khai khác như WoodStox làm trình phân tích cú pháp cơ bản.

2 - Làm cách nào để chắc chắn 100% cơ chế phân tích cú pháp cơ bản đang sử dụng?

Cũng giống như bạn đang làm. Nếu bạn vượt qua việc thực hiện JAXB một thể hiện của XMLStreamReader thì bạn có thể chắc chắn rằng nó đang được sử dụng một cách hợp lý. Nếu mặt khác, bạn unmarshalled từ một cái gì đó giống như một InputStream thì việc thực hiện JAXB là miễn phí để sử dụng bất cứ kỹ thuật phân tích cú pháp nó muốn. Nếu bạn đi với Woodstox hãy chắc chắn kiểm tra trang hiệu suất có cũng như:

+1

Cảm ơn. Ah vì vậy tôi đã sử dụng StAX thay vì SAX. Bạn cho rằng đó là cách nhanh nhất để sử dụng JAXB? –

+0

Không, StAX cung cấp hai loại trình đọc 'XMLStreamReader' và' XMLEventReader'. Tùy chọn 'XMLStreamReader' luôn là tùy chọn nhanh hơn. –

+0

Vâng tôi nhận được điều đó nhưng tôi chưa bao giờ sử dụng SAX trong ví dụ ban đầu của mình. Cách bạn đề xuất đến trong khoảng 1800ms (không có woodstox). Vẫn còn chậm hơn nhiều so với sử dụng JAXB bình thường. Tại sao điều này? –