dom4j和jaxb_JAXB,SAX,DOM性能

dom4j和jaxb

这篇文章研究了使用多种不同方法将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实例包装了FileReader实例,该实例由JAXB编组。

@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文档。 SAX方法比任何JAXB方法涉及更多的代码和更多的复杂性。 开发人员必须参与文档的解析。

@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);
}

该测试针对3个包含Person实体集合的文件运行了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的性能看起来要好得多。 内存使用情况看起来略高。

参考: JAXB 合作伙伴 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

dom4j和jaxb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5技能图谱——适合各阶段前端程序员的学习地图

导读&#xff1a;学过web前端的都知道&#xff0c;web前端开发主要包括结构、行为和表现。那么要做好web前端&#xff0c;必须知道哪些技能呢?今天孙叫兽给大家介绍web前端的学习地图。 目录 H5技能图谱 下载地址 H5技能图谱 是不是很简单呢&#xff0c;拿赶紧收藏起来学习…

java写exe程序实例_2012软考软件设计师辅导:利用JAVA执行本地EXE文件

曾经为了这样一个需求找了很多资料&#xff0c;今天终于学习到了&#xff01;如何利用java执行exe文件&#xff1f;使用java类Runtime&#xff0c;每个Java应用程序都有一个Runtime类实例&#xff0c;使应用程序能够与其运行的环境相连接。可以通过getRuntime方法获取当前运行时…

Hadoop 家族技能图谱——包含Hive和Mahout两个大类

导读:hadoop是开源的分布式存储和分布式计算平台.由HDFS(分布式文件存储系统,存储海量数据)Mapreduce(并行处理框架,实现任务分配和调度.)组成。可以搭建大型数据仓库,分析海量日志,存储,统计等。Zookeeper 解决分布式环境下的数据管理,统一命名,状态同步,集群管理,配…

java空格 逗号_Java将字符串中的空格换为逗号

import java.util.regex.Matcher;import java.util.regex.Pattern;public class Math {/*** param args*/public static void main(String[] args) {String str "a c b 1 2.2 3";//结果&#xff1a;a,c,b,1,,,,,,,,,,,2.2,,,,,,,,,3System.out.println(str.replaceA…

使用Spring JUnit规则进行参数化集成测试

Spring 4.2附带了全新的JUnit规则&#xff1a; SpringClassRule和SpringMethodRule 。 使用JUnit规则的主要优点是让开发人员摆脱SpringJUnit4ClassRunner并在Spring集成测试中利用不同的JUnit运行器。 我认为Spring JUnit Rules的最大机会是易于创建参数化的集成测试。 要测试…

逻辑的封闭性

始终认为&#xff0c;代码的好坏&#xff0c;在于思维逻辑的有效性、完整性&#xff08;封闭性&#xff09;&#xff0c;只有这样才可能尽量的保证少出现BUG&#xff0c;或者在需求变更的时候&#xff0c;出现改了一处又出现一处的问题 同样&#xff0c;在解决问题的时候&#…

IOS 开发技能图谱——ios 开发工程师必知必会要点

导读&#xff1a;iOS 开发工程师技能图谱&#xff0c;包含开发基础、开发进阶、设计模式、开源项目、APP上传与审核、第三方服务等。 IOS 开发工程师技能图谱 下载地址 点我下载高清iOS 开发工程师技能图谱 关注公众号 电商程序员&#xff0c;回复 iOS 开发工程师技能图谱&am…

java 数学表达式解析插件_数学表达式解析-JAVA版

1 、工具介绍String exp “v>10&&v<2000&&v%100”;在 js 中&#xff0c;能够直接运行 eval 得到结果&#xff0c; java 中也可以&#xff01;在 java 中运行执行这种字符串格式数学表达式的方法&#xff1a;1、自己写按照算法(逆波兰)一个解析程序。2、…

网络数据包收发流程(四):协议栈之packet_type

进入函数netif_receive_skb()后&#xff0c;skb正式开始协议栈之旅。先上图&#xff0c;协议栈大致过程如下所示&#xff1a;跟OSI七层模型不同&#xff0c;linux根据包结构对网络进行分层。比如&#xff0c;arp头和ip头都是紧跟在以太网头后面的&#xff0c;所以在linux协议栈…

OpenResty学习地图来啦,速速收藏!

导读&#xff1a;OpenResty学习地图&#xff0c;全英文文档 OpenResty学习地图 下载地址 点我下载高清OpenResty技能图谱 关注公众号电商程序员&#xff0c;回复OpenResty技能图谱&#xff0c;获取下载链接&#xff01;

java swing游戏_Java Swing井字游戏

java swing游戏大家好&#xff01; 哇&#xff0c;自从我在这里发布了东西以来已经有一段时间了&#xff01; 我必须说我真的很想写东西&#xff0c;我保证我不会再陷入“作家的障碍”。 希望 ..最近两个月发生了很多事情&#xff0c;我有很多话要说。 但是在这篇文章中&#x…

java子类和父类有相同成员_Java -- 父类和子类拥有同名的成员变量的情况

Java – 父类和子类拥有同名的成员变量取值情况参考文章 结论&#xff1a;当子类的成员变量与父类同名时&#xff0c;若对该成员变量进行操作的方法继承于父类&#xff0c;则改变和获取的是父类的成员变量。若对该成员变量进行操作的方法为子类所独有&#xff0c;或override父类…

恭喜孙叫兽在CSDN年度之“战”中脱颖而出——喜提一等奖(小米手环+定制勋章)

导读&#xff1a;在这个多灾多难又充满惊喜注定不平凡的2020年&#xff0c;大家一起与CSDN共同跨过了艰难的疫情&#xff0c;共同经历烦躁的远程办公&#xff0c;一起为科比的逝世而难过&#xff0c;共同度过2020那所谓世界末日&#xff0c;充满青春&#xff0c;充满活力&#…

Android listview item中使用TextWatcher

链接占位。回头补充&#xff1a;http://stackoverflow.com/questions/20958223/edittext-in-listview-is-updated-by-ontextchanged-when-scrolling 下solmaks的回答。 转载于:https://www.cnblogs.com/jonzone/p/5166297.html

关于java25个学习要点

1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、interaction以及statediagrams。 2. 你需要学习Java语言的基础知识以及它的核心类库(collections、serialization、streams、networking、multithreading、…

java mysql nclob_java语言操作Oracle数据库中的CLOB数据类型 (转)

java语言操作Oracle数据库中的CLOB数据类型 (转)[more]有关字段类型的相关信息可以查阅oracle技术网。下面摘抄一些有关blob.clob等类型的说明。又便于大家的了解。字段类型&#xff1a;blob,clob,nclob说明&#xff1a;三种大型(LOB)&#xff0c;用来保存较大的图形或带格式的…

使用Spring AOP和Guava速率限制器的节气门方法

外部服务或API可能有使用限制&#xff0c;或者它们无法处理请求负载而不会失败。 这篇文章解释了如何创建一个基于Spring Framework的方面&#xff0c;该方面可以用来限制使用Guava速率限制器的任何建议方法调用。 以下实现需要Java 8&#xff0c;Spring AOP和Guava。 让我们从…

Block(Closure) Tips

使用 Block 的时候谨记以下几点&#xff1a; 1.Block类型&#xff1a;全局块&#xff08;Global Block&#xff09;和堆块&#xff08;Heap Block&#xff09;&#xff0c;以及栈块&#xff08;Stack Block&#xff09;。2.变量捕获: 默认无法修改变量&#xff0c;需要添加 __b…

【APICloud系列|33】通过程序循环数据集合的时候闭包加入imageCache方法

导读:一般实现的两种思路 1、通过程序循环数据集合的时候闭包加入imageCache方法。 2、通过递归数据集合实现 发现都不是我理想的效果,数据集合量较大的时候imageCache处理的时间比不用imageCache展示的时间要慢很多,展示会有明显延迟,最终采取以下方法 还是for循环将html拼…

Linux最危险的几个命令

Linux最危险的几个命令 Linux最危险的几个命令危险命令介绍删除文件和目录命令rmLinux 的 dd 命令mkfs 格式化硬盘分区shutdown> fileMore Linux最危险的几个命令 仅个人想法&#xff0c;会持续不间断更新和改进。 Linux系统中的命令最美妙也最危险。 如果几个操作系统&…