JAXB,SAX,DOM性能

這篇文章探討了使用多種不同方法將XML文檔編組為Java對象的性能。 XML文檔非常簡單。 它包含一個Person實體的集合。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons><person><id>person0</id><name>name0</name></person><person><id>person1</id><name>name1</name></person>
...

XML中的Person實體有一個對應的Person Java對象
..

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"id","name"
})
public class Person {private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String value) {this.name = value;}
}

和一個PersonList對象代表一個Persons集合。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "persons")
public class PersonList {@XmlElement(name="person")private List<person> personList = new ArrayList<person>();public List<person> getPersons() {return personList;}public void setPersons(List<person> persons) {this.personList = persons;}
}

研究的方法是:

  • 各種口味的JAXB
  • 薩克斯
  • DOM
在所有情況下,目標都是使XML文檔中的實體到達相應的Java對象。 在Person和PersonList POJOS上的JAXB批注用于JAXB測試中。 可以在SAX和DOM測試中使用相同的類(注釋將被忽略)。 最初是參考

使用了JAXB,SAX和DOM的實現。 然后使用Woodstox STAX解析。 在某些JAXB解組測試中會調用此方法。

測試是在運行Windows 7的戴爾筆記本電腦,2.1 GHz奔騰雙核CPU上進行的。

測試1 –使用JAXB解組Java文件。

@Test
public void testUnMarshallUsingJAXB() throws Exception {JAXBContext jc = JAXBContext.newInstance(PersonList.class);Unmarshaller unmarshaller = jc.createUnmarshaller();PersonList obj = (PersonList)unmarshaller.unmarshal(new File(filename));
}

測試1說明了JAXB的編程模型有多簡單。 從XML文件到Java對象非常容易。 無需參與編組和解析的精妙細節。

測試2 –使用JAXB解組流源


測試2與測試1類似,不同之處在于,這次流源對象包裝在文件對象周圍。 Streamsource對象向JAXB實現提供提示以流式傳輸文件。

@Test
public void testUnMarshallUsingJAXBStreamSource() throws Exception {JAXBContext jc = JAXBContext.newInstance(PersonList.class);Unmarshaller unmarshaller = jc.createUnmarshaller();StreamSource source = new StreamSource(new File(filename));PersonList obj = (PersonList)unmarshaller.unmarshal(source);
}

測試3 –使用JAXB解組StAX XMLStreamReader

再次類似于測試1,除了這次XMLStreamReader實例包裝了由JAXB編組的FileReader實例。

@Test
public void testUnMarshallingWithStAX() throws Exception {FileReader fr = new FileReader(filename);JAXBContext jc = JAXBContext.newInstance(PersonList.class);Unmarshaller unmarshaller = jc.createUnmarshaller();XMLInputFactory xmlif = XMLInputFactory.newInstance();XMLStreamReader xmler = xmlif.createXMLStreamReader(fr);PersonList obj = (PersonList)unmarshaller.unmarshal(xmler);
}

測試4 –僅使用DOM

該測試不使用JAXB,而是僅使用JAXP DOM方法。 這意味著比任何JAXB方法都需要更多的代碼。

@Test
public void testParsingWithDom() throws Exception {DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = domFactory.newDocumentBuilder();Document doc = builder.parse(filename);List personsAsList = new ArrayList();NodeList persons = doc.getElementsByTagName("persons");for (int i = 0; i <persons.getLength(); i++) {Element person = (Element)persons.item(i);NodeList children = (NodeList)person.getChildNodes();Person newperson = new Person();for (int j = 0; j < children.getLength(); j++){Node child = children.item(i);if (child.getNodeName().equalsIgnoreCase("id")) {newperson.setId(child.getNodeValue());} else if (child.getNodeName().equalsIgnoreCase("name")) {newperson.setName(child.getNodeValue());}}personsAsList.add(newperson);}
}

測試5 –僅使用SAX測試5不使用JAXB,而使用SAX來解析XML文檔。 與任何JAXB方法相比,SAX方法涉及更多的代碼和更多的復雜性。 開發人員必須參與文檔的解析。

@Test
public void testParsingWithSAX() throws Exception {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser saxParser = factory.newSAXParser();final List<person> persons = new ArrayList<person>();DefaultHandler handler = new DefaultHandler() {boolean bpersonId = false;boolean bpersonName = false;public void startElement(String uri, String localName,String qName,    Attributes attributes) throws SAXException {if (qName.equalsIgnoreCase("id")) {bpersonId = true;Person person = new Person();persons.add(person);} else if (qName.equalsIgnoreCase("name")) {bpersonName = true;}}public void endElement(String uri, String localName, String qName) throws SAXException {}public void characters(char ch[], int start, int length) throws SAXException {if (bpersonId) {String personID = new String(ch, start, length);bpersonId = false;Person person = persons.get(persons.size() - 1);person.setId(personID);} else if (bpersonName) {String name = new String(ch, start, length);bpersonName = false;Person person = persons.get(persons.size() - 1);person.setName(name);}}};saxParser.parse(filename, handler);
}

對于包含Person實體集合的3個文件,該測試運行了5次。 第一個文件包含100個Person實體,大小為5K。 第二個包含10,000個實體,大小為500K,第三個包含250,000個Person實體,大小為15 Meg。 在任何情況下都不會使用任何XSD或進行任何驗證。 結果在結果表中給出,其中不同運行時間用逗號分隔。

試驗結果

首先使用32位JDK 1.6.26運行測試,并使用JDK附帶的SAX,DOM和JAXB的參考實現。

解組類型 100人次(毫秒) 10K人次(毫秒) 25萬人次(毫秒)
JAXB(默認) 48,13,5,4,4 78,52,47,50,50 1522、1457、1353、1308、1317
JAXB(流源) 11,6,3,3,2 44,44,48,45,43 1191、1364、1144、1142、1136
JAXB(StAX) 18,2,1,1,1 111、136、89、91、92 2693、3058、2495、2472、2481
DOM 16,2,2,2,2 89,50,55,53,50 1992、2198、1845、1776、1773
薩克斯 4,2,1,1,1 29,34,23,26,26 704、669、605、589,591



JDK 1.6.26測試注釋

  1. 通常,第一次進行編組的時間最長。
  2. JAXB和SAX的內存使用情況相似。 10,000個人的檔案約為2 Meg,而250,000的檔案是36 – 38 Meg檔案。 DOM內存使用率更高。 對于10,000個人檔案,它是6 Meg,對于250,000個人檔案,它是大于130 Meg。
  3. 純SAX的性能更好。 特別是對于非常大的文件。

使用相同的JDK(1.6.26)再次運行完全相同的測試,但是這次使用了StAX解析的Woodstox實現。

解組類型 100人次(毫秒) 10K人次(毫秒) 25萬人次(毫秒)
JAXB(默認) 168,3,5,8,3 294、43、46、43、42 2055、1354、1328、1319、1319
JAXB(流源) 11,3,3,3,4 43,42,47,44,42 1147、1149、1176、1173、1159
JAXB(StAX) 30,0,1,1,0 67,37,40,37,37 1301、1236、1223、1336、1297
DOM 103,1,1,1,2 136,52,49,49,50 1882、1883、1821、1835、1822
薩克斯 4,2,2,1,1 31,25,25,38,25 613、609、607、595、613



JDK 1.6.26 + Woodstox測試注釋

  1. 同樣,第一次進行編組通常會成比例地變長。
  2. 同樣,SAX和JAXB的內存使用情況非常相似。 兩者都好得多

    比DOM。 結果與測試1非常相似。

  3. JAXB(StAX)進近時間已大大縮短。 這是由于

    正在使用StAX解析的Woodstox實現。

  4. 純SAX的性能時間仍然是最好的。 尤其

    用于大文件。

再次運行完全相同的測試,但是這次我使用了JDK 1.7.02和StAX解析的Woodstox實現。

解組類型 100人次(毫秒) 10,000人次(毫秒) 250,000人次(毫秒)
JAXB(默認) 165,5,3,3,5 611,23,24,46,28 578、539、511、511、519
JAXB(流源) 13,4,3,4,3 43,24,21,26,22 678、520、509、504、627
JAXB(StAX) 21,1,0,0,0 300,69,20,16,16 637、487、422、435、458
DOM 22,2,2,2,2 420,25,24,23,24 1304、807、867、747、1189
薩克斯 7,2,2,1,1 169,15,15,19,14 366、364、363、360、358



JDK 7 + Woodstox測試注釋:

  1. 總體而言,JDK 7的性能要好得多。 有一些異常-第一次解析100個人和10,000個人檔案。
  2. 內存使用量略高。 對于SAX和JAXB,10,000人檔案為2 – 4 Meg,對于250,000人檔案為45 – 49 Meg。 對于DOM,它再次更高。 10,000人的檔案5 – 7.5 Meg,250,000人的檔案136 – 143 Meg。



注意:WRT所有測試

  1. 沒有對100人文件進行內存分析。 內存使用量太小,因此將沒有意義的信息。
  2. 首次初始化JAXB上下文最多需要0.5秒。 這不包括在測試結果中,因為這只是第一次。 之后,JVM會非常快地初始化上下文(始終小于5毫秒)。 如果您在使用任何JAXB實現時都注意到此行為,請考慮在啟動時進行初始化。
  3. 這些測試是一個非常簡單的XML文件。 實際上,將會有更多的對象類型和更復雜的XML。 但是,這些測試仍應提供指導。

結論:

  1. 純SAX的性能時間略好于JAXB,但僅適用于非常大的文件。 除非使用的文件非常大,否則性能差異不值得擔心。 JAXB的編程模型優勢克服了SAX編程模型的復雜性。 別忘了JAXB也像DOM一樣提供隨機訪問。 SAX不提供此功能。
  2. 如果使用JAXB / StAX,則使用Woodstox的性能時間看起來要好得多。
  3. 使用64位JDK 7的性能看起來要好得多。 內存使用情況看起來略高。

參考:來自都柏林技術博客的 JCG合作伙伴 Alex Staveley的JAXB,SAX,DOM性能 。

相關文章 :

  • 使用JAXB從XSD生成XML
  • 將對象映射到多個XML模式–天氣示例
  • 使用Spring MVC開發Restful Web服務
  • 具有簡單框架教程的Android XML綁定
  • 使用XML Pull增強Android XML解析

翻譯自: https://www.javacodegeeks.com/2011/12/jaxb-sax-dom-performance.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373850.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛擬機Linux圖形界面配置NAT-橋接

點開“虛擬機->設置->橋接模式&#xff08;勾選復制物理網絡連接狀態&#xff09;->確認” 點擊“右上角扇形網絡圖標->Edit Connections->Wired->選中->Delete->Add->IPv4 Settings->Method(Manual)->Add->輸入IP&#xff0c;子網掩碼&am…

年輕人應該謹記的十點

有個朋友的孩子今年大學畢業&#xff0c;托我幫他找個“好工作”&#xff0c;而且再三強調&#xff0c;這關系到孩子的前途命運&#xff0c;要我一定要全力以赴。他&#xff0c;一個非名牌大學的計算機網絡專業應屆畢業生&#xff0c;沒有工作經驗&#xff0c;他能找一個什么樣…

python自動化構建工具_Python自動化構建工具scons使用入門筆記

這段時間用到了scons&#xff0c;這里總結下&#xff0c;也方便我以后查閱。一、安裝sconsLinux環境(以CentOS為例)1、yum安裝yum install scons2、源碼安裝下載scons&#xff1a;http://http://jaist.dl.sourceforge.net/project/scons/scons/2.3.0/scons-2.3.0.zip安裝scons&…

Java 8狀態更新

即將到來的Java SE 8發行版的兩大新語言功能是Lambda Expressions和Modularity。 對于這兩者&#xff0c;這些天的狀態更新已經發布。 我會與您共享鏈接&#xff0c;因此您可能會在假期中通讀它們 Oracle計劃在2013年中期發布Java SE 8。 Lambda項目 Lambda項目以及JSR-335希望…

java 18 - 6 TreeMap嵌套使用

HashMap嵌套HashMap   動物     犬類         哈士奇   2         薩摩耶   1     貓類        波斯貓   2        加菲貓   3 先存儲元素&#xff0c;然后遍歷元素 1 package map_son;2 3 import java.util.HashMap;4 import…

程序設計語言

程序設計語言使用于書寫計算機程序的語言。程序設計語言有3個方面的因素&#xff0c;即語法&#xff0c;語義和語用。語法標識程序的結構或形式。語義表示程序的含義。語用表示程序與使用者的關系。 程序設計語言的發展史 程序的復雜性度量 1&#xff0c;代碼行度量法 出錯率&a…

python集合類型是一種具體的數據類型_Python3基礎語法之集合類型

set也是一種組合數據類型&#xff0c;支持成員關系操作(in)、對象大小計算操作符(len())&#xff0c;并且是iterable。集合數據類型至少提供一個set.isdisjoin()方法&#xff0c;支持比較&#xff0c;也支持為邏輯操作(在集合用于聯合、交叉等上下文中使用)。只有可哈希運算的對…

Linux 安裝之U盤引導

說到裝系統最簡單的方法無非就是找個系統安裝光盤來然后就一步一步慢慢的安裝。簡單是簡單但好似大多數人好像都木有Linux的安裝光盤。因此只能用U盤來模擬光盤的功能來裝系統咯。 電腦上裝有Windows 7現要裝Linux變雙系統。 安裝Linux前的準備&#xff1a; 1、電腦上分出空閑的…

OSGi:簡介

為基于Java的系統創建的OSGi提供了模塊化系統的框架。 OSGi使得可以定義每個單獨模塊與其他模塊的依賴關系&#xff0c;并使用戶可以控制生命周期并動態更改系統的每個組件。 OSGi是一個規范&#xff0c;最常見的實現可以算作Equinox &#xff0c; Apache Felix和Knoplerfish 。…

一起動手打造個人娛樂級linux

我們使用電腦&#xff0c;一直以來用的都是windows&#xff0c;但是對于像我這種愛折騰的人來說&#xff0c;嘗試使用linux系統應該是一種不錯的體驗。說到linux&#xff0c;許多人可能都沒聽過&#xff0c;或者知道的人對它印象是這樣的&#xff1a; 然而&#xff0c;linux發展…

PostgreSQL數據類型

http://blog.csdn.net/neo_liu0000/article/details/6254086 第六章 數據類型 6.1概述 PostgreSQL 提供了豐富的數據類型。用戶可以使用 CREATE TYPE 命令在數據庫中創建新的數據類型。PostgreSQL 的數據類型被分為四種&#xff0c;分別是基本數據類型、復合數據類型、域和偽類…

centos 卸載ffmpeg_CentOS Linux 操作系統安裝 FFmpeg 教程

FFmpeg 是一個非常熱門的開源項目&#xff0c;用來編解碼音頻視頻流&#xff0c;被廣泛用于各種流服務中。本教程在 CentOS 6、7、8 上面都可以使用&#xff0c;用來安裝 FFmpeg 軟件。一、安裝前需求一個 sudo 賬戶&#xff0c;一般都是默認 root 賬戶即可。1、CentOS 8安裝所…

Linux 火狐瀏覽器安裝Flash插件

Linux系統安裝完畢后&#xff0c;發現火狐瀏覽器視頻播放不了而且總是提示安裝Flash。而按火狐瀏覽器上的提示Flash插件安裝總是失敗&#xff0c;木有辦法只能手動安裝Flash插件啦。 到Flash官網&#xff1a;http://get.adobe.com/cn/flashplayer/ 下載系統對應的Flash插件&…

按匯總分組/多維數據集

時不時地&#xff0c;您會遇到一個使您達到SQL限制的要求。 我們中的許多人可能會提早放棄并使用Java / [或您的語言]計算內容。 相反&#xff0c;使用SQL可能是如此簡單快捷。 如果您使用的是高級數據庫&#xff0c;例如DB2 &#xff0c; Oracle &#xff0c; SQL Server &…

TCPUDP

TCP(傳輸控制協議) 建立連接&#xff0c;形成傳輸數據的通道在連接中進行大數據傳輸&#xff08;數據大小不受限制&#xff09;通過三次握手完成連接&#xff0c;是可靠協議&#xff0c;安全送達&#xff08;三次握手向服務器發送請求&#xff0c;響應請求回復&#xff0c;發送…

Windows和linux雙系統——修改默認啟動順序

電腦上裝了Windows 7和Ubantu雙系統&#xff0c;由于Linux系統用的次數比較少并且還是默認的啟動項對此很不能容忍&#xff0c;因此得修改Windows為默認的啟動項。 由于電腦上的系統引導程序是GRUB&#xff0c;因此修改當然也就落到Linux系統上啦。 修改/boot/grub/grub.cfg該文…

ft232h引腳_usb轉串口芯片 ft232的奇怪現象

硬件平臺&#xff1a;stm32f407ft232RL按照手冊上的電路&#xff0c;我用USB接口給ft232RL供電&#xff0c;如下圖&#xff1a;0288f358ccd0026690b2443b41d98f0f_224.png (0 Bytes, 下載次數: 12)2010-12-14 22:54 上傳我在這個電路的基礎上我用單片機串口和芯片對應的TX和RX相…

微軟Team Foundation Service 的Scrum模板中的Feature和Backlog Items 的區別【轉載】

Features help us plan work better in Team Foundation Service Scrum process 【原文&#xff1a;http://www.nsilverbullet.net/2013/06/04/features-help-us-plan-work-better-in-team-foundation-service-scrum-process/】 Recently a new work item type named “Featur…

LeWeb – 2011 –綜述

在我去機場前幾個小時&#xff0c;我將寫最后一篇與LeWeb相關的文章。 這次&#xff0c;我將專注于會議本身。 參加過幾次開發人員會議&#xff08;雖然不多&#xff0c;但足以給您帶來一定的經驗&#xff09;&#xff0c;我已經開發了自己的自定義會議等級框架。 我使用以下6條…

Java 入門基礎——面向對象的特征

計算機軟件系統是現實生活中的業務在計算機中的映射&#xff0c;而現實生活中的業務其實就是一個個對象協作的過程。面向對象編程就是按現實業務一樣的方式將程序代碼按一個個對象進行組織和編寫&#xff0c;讓計算機系統能夠識別和理解用對象方式組織和編寫的程序代碼&#xf…