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.mzph.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…