`
wenshao
  • 浏览: 269513 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

吹牛:我写的JSONParser可能是这个星球上最快了(Java)

阅读更多
我拥有多年手写Parser的经验,在以前,编写过多个Parser,有SQL的Parser,也有JavaScript的Parser,也有Java的Parser。

在最近的项目中,也需要使用JSON,其中client部分不希望存在依赖,所以就写了一个JSON     Parser。最初是直接使用SimpleJSON的,因为其代码少,接口简洁。一个同事说,SimpleJSON存在性能问题,噢,我想,那算了,我自己写一个吧,JSON语法这么简单,对于有“多年行医经验”(来自典故《日本兵与老中医》)的我,自然不是困难的事情,也就是一个晚上就写完了,应用于项目中,测试结果,网络协议的性能提升了两倍,从原来的80,000 TPS提升到了240,000 TPS。顺带说一个花絮,周六晚上加班写完的,直接就应用到项目中了,虽然有TestCase,但还是有一个地方没注意好,出现了一个Bug,星期一还影响了测试工作,早会的时候被同事血泪控诉。

我跟朋友炫耀了一下,朋友说,为啥不用jackson,jackson速度很快。好吧,我就和jackson做了一个性能比较,在大多数场景都是比jackson性能好很多,但是在某一个场景,竟然比jackson稍慢。我不服气啊,因为一看就觉得jackson的Parser写得不够专业,没理由比我这种多年经验的老鸟快的。跟踪其实现代码找到了其优化的办法,觉得那是取巧,不屑于使用。于是优化一下我写的Parser,优化的结果自然是全面超越它。好吧,废话少说,直接上结果。

场景1:
[{"S":321061,"T":"GetAttributeResp"},{"ERROR":null,"TS":0,"VAL":{"SqlList":[{"BatchSizeMax":0,"BatchSizeTotal":0,"ConcurrentMax":1,"DataSource":"jdbc:wrap-jdbc:filters=default,encoding:name=ds-offer:jdbc:mysql://100.10.10.10:8066/xxxx","EffectedRowCount":0,"ErrorCount":0,"ExecuteCount":5,"FetchRowCount":5,"File":null,"ID":2001,"LastError":null,"LastTime":1292742908178,"MaxTimespan":16,"MaxTimespanOccurTime":1292742668191,"Name":null,"RunningCount":0,"SQL":"SELECT @@SQL_MODE","TotalTime":83}]}}] 

fast-json : 8,608,334 (我写的parser)
jackson : 17,172,500
simple-json : 36,258,008


场景2:
{"S":321061,"T":"GetAttributeResp"}

fast-json : 1,028,024
jackson : 6,673,850
simple-json : 20,294,257

场景3:
引用
{"name":null,"flag":true}

fast-json : 842,032
jackson : 7,284,100
simple-json : 20,553,188

场景4:
[-5.041598256063065E-20,-7210028408342716000]

fast-json : 1,338,822
jackson : 10,000,239
simple-json : 20,202,679

场景5:
-6470204979932713723

fast-json : 389,004
jackson : 5,405,129
simple-json : 20,418,252

以上的结果都是执行一千次的时间总和,单位是nano。连续执行测试50次,取最后一次的结果,让JVM能够充分优化。JVM的参数是-server。

结论,越简单的对象,偶写的parser(fast-json)性能越好。如场景3,都快差不多100倍了。

好了,吹牛结束啦,有什么后续动作呢?有同事建议开源,嗯,这个建议挺好的,我喜欢用开源的东西,也希望对开源有所贡献,我整理好代码之后,就会开源出来。

注明,我写的Parser是能通过JSON官方的兼容性测试的,不是缺乏功能的残废!

----------------------------------------------

svn已经能够外网访问:
http://119.38.217.15/svn/fastjson/trunk/
(注意,IP地址在2011-1-10修改过)

域名申请的事情还在进行中,还有很多事情要做。最终这是一个类似taobao code(淘蝌蚪)的开源平台,我们的名字叫做Open Sesame。

分享到:
评论
375 楼 weifly 2011-04-12  
代码写的很工整,虽然注释信息少了些,但还是很好理解的
374 楼 无根V稻草 2011-04-11  
东东呢??搞出来瞅瞅撒
373 楼 wenjinglian 2011-04-11  
372 楼 geminiyellow 2011-03-08  
阿里系的牛人麽
371 楼 wenshao 2011-03-08  
代码早就公布了,在这里:
http://code.alibabatech.com/svn/fastjson/trunk/
370 楼 javageek123 2011-03-08  
同求同求,码啊
369 楼 moqinan 2011-03-08  
搬个小板凳等代码。。。
368 楼 faye.feelcool 2011-03-03  
轮回啊,罪过罪过。
从功能-》性能;从性能 在回归到功能。
这个最快称呼,也许不久会被最强功能所替代。

软件为一个理由而生,为无尽的需求而活,为膨胀而死。
367 楼 lzmhehe 2011-03-02  
首先先感谢一下你写的这个顺手的工具
再次提一个bug

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD })
public @interface JSONField {
	String name() default "";

	boolean serialize() default true;

	boolean deserialize() default true;
}


表示JSONField 可以再field上面注释

但是对AnnotationTest做如下修改
@JSONField(name = "desc")
private String descrition;
结果输出为
{"descrition":"大黄牛","name":"bob.panl","ID":1001}

我个人认为注释写在filed上面比写在getter setter上面更方便


具体修改
package com.alibaba.json.test.bvt;

import junit.framework.Assert;
import junit.framework.TestCase;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;

public class AnnotationTest extends TestCase {

	public void test_codec() throws Exception {
		User user = new User();
		user.setId(1001);
		user.setName("bob.panl");
		user.setDescrition("大黄牛");

		String text = JSON.toJSONString(user);
		System.out.println(text);

		User user1 = JSON.parseObject(text, User.class);

		Assert.assertEquals(user1.getId(), user.getId());
		Assert.assertEquals(user1.getName(), user.getName());
	}

	public static class User {
		private int id;
		private String name;
		
		@JSONField(name = "desc")
		private String descrition;

		@JSONField(name = "ID")
		public int getId() {
			return id;
		}

		@JSONField(name = "ID")
		public void setId(int id) {
			this.id = id;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

	
		public String getDescrition() {
			return descrition;
		}

		
		public void setDescrition(String descrition) {
			this.descrition = descrition;
		}

	}
}

366 楼 wenshao 2011-03-01  
downpour 写道
用下来感觉还不错。

不知道是否能够提供另外一个接口,通过输入一个FileInputStream来解析JSONString的。

我之前使用的sojo就有这个功能,很方便:


JsonParserGenerate jsonParserGenerate = new JsonParserGenerate(new FileInputStream(ResourceUtils.getFile("classpath:menu.json")));
List<?> menus = (List<?>) jsonParserGenerate.parse();



sojo用了很久,接口比较方便,想完全转到你写的parser上来,简单的接口改改还好,要是像这样从文件读的需求还要我手写去读文件,我就不高兴去改了。呵呵。


嗯,好建议,1.0.2中将会加入进去,之前的版本只考虑性能,之后会逐步补充更多的功能。不过最近好多其他的事情,进度可能会稍慢一些。
365 楼 downpour 2011-03-01  
用下来感觉还不错。

不知道是否能够提供另外一个接口,通过输入一个FileInputStream来解析JSONString的。

我之前使用的sojo就有这个功能,很方便:


JsonParserGenerate jsonParserGenerate = new JsonParserGenerate(new FileInputStream(ResourceUtils.getFile("classpath:menu.json")));
List<?> menus = (List<?>) jsonParserGenerate.parse();



sojo用了很久,接口比较方便,想完全转到你写的parser上来,简单的接口改改还好,要是像这样从文件读的需求还要我手写去读文件,我就不高兴去改了。呵呵。
364 楼 longrm 2011-02-28  
我怎么加不进去呢
363 楼 imp860124 2011-02-21  
被标题吸引了。好奇中。
362 楼 mapleqinfeng 2011-02-15  
看到362楼真累啊
不晓得老外看到是啥感觉
希望LZ坚挺
361 楼 wenshao 2011-02-01  
Allen 写道
http://sourceforge.net/projects/fastjson/

SF上面这个,是wenshao自己放上去的吗?以后会持续在SF上面更新吗?


是的,不过sourceforge上只提供下载
360 楼 lwyx2000 2011-01-31  
人才·~找下源码好好学学·~~~
359 楼 Allen 2011-01-31  
http://sourceforge.net/projects/fastjson/

SF上面这个,是wenshao自己放上去的吗?以后会持续在SF上面更新吗?
358 楼 lazybird86 2011-01-23  
wenshao 写道
感觉已经逐步稳定了,考虑这个星期内发布正式版本1.0.0。文档还是处于空白状态,需要逐步补上,有没有志愿者帮忙啊

一直都在关注这个帖子。有兴趣,不知道lz要求文档是何种程度的?要帮忙,可以站内联系我,上班的时候整整。。。
357 楼 wenshao 2011-01-22  
ak121077313 写道
com.alibaba.fastjson.JSONException: TODO : java.util.ArrayList<java.util.HashMap<java.lang.String, java.lang.String>>

请教这个问题怎么解决。 好像有的类型不支持。


确认是问题,已经记录在JIRA中,正在跟进处理,谢谢反馈。
http://119.38.217.15/jira/browse/FASTJSON-3
356 楼 wenshao 2011-01-22  
ak121077313 写道
还有 ListSerializer write 没有对 Object为null处理。


确认是问题,已经记录在JIRA中,正在处理,谢谢反馈!

http://119.38.217.15/jira/browse/FASTJSON-6

相关推荐

Global site tag (gtag.js) - Google Analytics