`
netskys
  • 浏览: 48493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

jackson 和flexjson 的性能及比较

 
阅读更多
    对于json对象的序列化和反序列化的性能问题一直是大家关注的焦点和考虑应用哪门技术的出发点。在众的json中 我选择了flexjson 和jackson (jsonlib这个东东就算了吧,跟它谈性能优点离谱)写了个demo做了简单的比较,同时说下自己的应用感受。
1 从API而言flexjson 已经算是很成熟了,jackson却很多方法要自己去搞。当然往往自己去搞的扩展性比较强。(这算是废话,就跟挣钱少的潜力大一样的废话)。
2 从代码的理解、命名和友好性上 flexjson 最起码望文生义,而jackson 就有点不太人性化的类和方法名。
3 从使用广度和深度上,jackson有spring团队的支持和推崇,加之新技术对它的自动封装的支持,使得jackson很快就挤进了json行列,而flexjson则依旧如故的不愠不火,看着官网上的版本最近的都一年前的。。悲剧
4 这里只比较flexjson和jackson 请朋友们不要拿其他json工具包说事。像什么gson、fastjson 等等风起云涌,这里我也表示崇拜下。
5 关键是性能,总体而言 在测试 小数据量时 明显 flexjson 和序列化 比jackson 要强很多,但是反序列化 flexjson 就大不如jackson ,而当内容比较大时 差距就更加明显,当 50--100倍的数据时 flexson 技术增长了10-20倍的开销,而jackson几乎没什么变化,当超过 100倍时 flexjson 直接OOM ,而jackson 依旧稳重性能之增加2倍。
6 所以 使用哪个要看场合,看网络传输、看数据量、看开发成本、看团队、看架构,当然我只是做了个时间的测试,只是从这点来看也不算太全面,但是也是可以反应出一些东西的。个人理解的东西 往往 主管片面,在此我附上代码,愿意测试的朋友可以自己来搞搞,欢迎探讨。

7 测试类 目前四个实体,分别一对多的情况做了三层嵌套,数据量 根据对象的个数自己设置

	public static void main(String[] args) {
		FlexjsonTest test=new  FlexjsonTest();
		int p1=1,p2=1;
		System.out.println("主类 1 个对象,子类分别为 1 、1 、1时 的情况如下");
		test.flexjsonTest(p1, p2);
		test.jacksonTest( p1, p2);
		
		p1=10;p2=10;
		System.out.println("主类 10 个对象,子类分别为 10 、10、10 时的情况如下");
		test.flexjsonTest(p1, p2);
		test.jacksonTest( p1, p2);
		
		p1=50;p2=10;
		System.out.println("主类50个对象,子类分别为 10 、10、10 时的情况如下");
		test.flexjsonTest(p1, p2);
		test.jacksonTest( p1, p2);
	
		p1=100;p2=10;
		System.out.println("主类50个对象,子类分别为 10 、10、10 时的情况如下");
		test.flexjsonTest(p1, p2);
		test.jacksonTest( p1, p2);
	}


public String  flexjsonTest(int p1,int p2){
		
		List<TestPojo> list=this.getList(p1, p2);
		
		long start=System.currentTimeMillis();
		JSONSerializer serializer=new JSONSerializer();
		serializer.exclude("*.class");
		String jsonStr=serializer.deepSerialize(list);
		long end=System.currentTimeMillis();
	//	System.out.println("序列化字符串结果:");
	//	System.out.println(jsonStr);
		System.out.println("flexjson序列化消耗时间为:"+(end-start)+"ms");
		JSONDeserializer<List<TestPojo>> deserializer=new JSONDeserializer<List<TestPojo>>();
		List<TestPojo> result=deserializer.use(null, TestPojo2.class).deserialize(jsonStr);
		System.out.println("flexjson反序列化的消耗时间为:"+(System.currentTimeMillis()-end)+"ms");
	//	System.out.println("flexjson反序列化字符串结果:");
	//	System.out.println(result);
		return jsonStr;
	}

	public void jacksonTest(int p1,int p2){
		List<TestPojo> list=this.getList(p1, p2);
		long start=System.currentTimeMillis();
		
		ObjectMapper  objectMapper = new ObjectMapper();
		
		
		try {
	//		objectMapper.writeValue(System.out, list);
	//		System.out.println("jackson  objectMapper序列化消耗时间为:"+(System.currentTimeMillis()-start)+"ms");
			//new File("d:\\json.txt")
			ByteArrayOutputStream stream=new ByteArrayOutputStream();
			JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(stream, JsonEncoding.UTF8);
			jsonGenerator.writeObject(list); 
		//	System.out.println(stream.toString());
			long end=System.currentTimeMillis();
			
			System.out.println("jackson  jsonGenerator序列化消耗时间为:"+(end-start)+"ms");
			//	System.out.println("jackson序列化字符串结果:");
			
			List<TestPojo> result=objectMapper.readValue(stream.toString(), ArrayList.class);
			
			System.out.println("jackson反序列化的消耗时间为:"+(System.currentTimeMillis()-end)+"ms");
			
		} catch (IOException e) {
			e.printStackTrace();
		}

	



得出结果如下
主类 1 个对象,子类分别为 1 、1 、1时 的情况如下
flexjson序列化消耗时间为:27ms
flexjson反序列化的消耗时间为:22ms
jackson  jsonGenerator序列化消耗时间为:177ms
jackson反序列化的消耗时间为:19ms

主类 10 个对象,子类分别为 10、01 、10时 的情况如下
flexjson序列化消耗时间为:174ms
flexjson反序列化的消耗时间为:113ms
jackson  jsonGenerator序列化消耗时间为:214ms
jackson反序列化的消耗时间为:77ms

主类 50 个对象,子类分别为 10、01 、10时 的情况如下
flexjson序列化消耗时间为:595ms
flexjson反序列化的消耗时间为:447ms
jackson  jsonGenerator序列化消耗时间为:237ms
jackson反序列化的消耗时间为:183ms

Flexjson 100时如下
主类 100 个对象,子类分别为 10、01 、10时 的情况如下
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Jackson 100时
主类 100 个对象,子类分别为 10、01 、10时 的情况如下
jackson  jsonGenerator序列化消耗时间为:381ms
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space



总体可见 反序列化确实 比序列化耗费性能 所以 我们在 如参数自己拼对象 比 反序列化对象好多了,可能flex 也是考虑到反序列化用的少,就没在去优化吧。 附件为源码 请参考 直接看 FlexjsonTest 类就可以。
分享到:
评论
1 楼 幻无极 2012-03-08  
这个jackson用的是流不会溢出
flexjson默认用的Stringbuiler
如果用流也不会溢出
        Writer writer = new StringWriter();
        new JSONSerializer().serialize(samples, writer);

相关推荐

    flexJson.jar包,和列子

    - FlexJson允许你通过实现`SerializerListener`和`DeserializationListener`接口来自定义对象的序列化和反序列化行为。例如,你可能想忽略某些属性,或者在反序列化时执行特定的逻辑。 4. **处理复杂的JSON结构**...

    flexjson组件

    9. **与其他JSON库比较**:虽然Flexjson是一个不错的选择,但Java世界中有许多其他JSON库,如Jackson、Gson、JSON-P和JSON-B等。每个库都有其特点和优势,选择哪个取决于具体需求,如性能、易用性、API丰富度等。 ...

    JSON类库 Flexjson

    - **Jackson**: FasterXML的Jackson库性能出色,功能全面,但在某些场景下,Flexjson的简单性和易用性可能更受欢迎。 6. **注意事项** - Flexjson不包含所有JSON标准的功能,例如JSON Schema验证。 - 对于大型...

    jackson-mapper 1.8.5 LGPL版

    jackson-mapper, jackson是一个处理JSON格式数据的类库,相对于flexjson,gson性能高很多.

    JSON类库 Flexjson.7z

    9. **性能优化**:尽管Flexjson设计简洁,但它的性能表现良好,尤其在处理大量数据时。 10. **社区支持**:由于Flexjson是一个开源项目,它拥有活跃的社区支持,不断进行维护和更新,以适应新的Java特性和开发者...

    基于Java的实例开发源码-JSON类库 Flexjson.zip

    6. **性能**:尽管Flexjson不如一些专为性能优化的JSON库快,但它在易用性和灵活性上具有优势,适合小到中型项目使用。 7. **错误处理**:Flexjson在遇到序列化或反序列化错误时会抛出异常,帮助开发者快速定位问题...

    json所需要的所有包

    而Jackson因其灵活性和高性能在大型项目中广泛应用;如果你正在一个遵循Java EE规范的环境中工作,那么JSON-P API可能是标准的选择。 在实际开发中,你可能需要根据项目需求、性能要求以及团队熟悉度来选择合适的...

    Flex与Java使用Json数据交互JAR包

    在实际开发中,这种数据交互方式可以极大地提高应用的性能和响应速度,因为JSON比XML更轻量级,传输速度快。同时,由于JSON格式与JavaScript原生兼容,因此在Flex这样的基于ActionScript的环境中,使用JSON进行数据...

    java开源包1

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包11

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包2

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包3

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包6

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包5

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包10

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包4

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包8

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包7

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包9

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

Global site tag (gtag.js) - Google Analytics