当前位置:首页 > 开发 > 开源软件 > 正文

fastjson初始化对性能的影响

发表于: 2015-07-02   作者:kane_xie   来源:转载   浏览:
摘要: 之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营。对比了jackson,gson等框架之后,决定用fastjson,为什么呢,因为看名字感觉很快。。。   网上的说法:   fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。

之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营。对比了jackson,gson等框架之后,决定用fastjson,为什么呢,因为看名字感觉很快。。。

 

网上的说法:

 

fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。

主要特点:

快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
零依赖(没有依赖其它任何类库除了JDK)

 

但是测试的结果让我大跌眼镜。

 

Test Case: 对一个User类(空)的对象分别用java和fastjson序列化1000次,再反序列化1000次,计算时间。注: 测试不是非常严谨,只是做个简单的比较。

 

Test Result: 

 

Type = java
Serialize cost = 27ms
Deserialize cost = 75ms

Type = fastjson
Serialize cost = 385ms
Deserialize cost = 84ms

 

这是在逗我吗。。。

 

经过同事提醒,看了源码发现fastjson在序列化时需要初始化SerializeConfig,反序列化时需要初始化ParserConfig。然后我在测试案例中加入这两句

 

public static ParserConfig pc = new ParserConfig();
public static SerializeConfig sc = new SerializeConfig();

 

果然快了很多,但仍旧不理想

 

Type = fastjson
Serialize cost = 36ms
Deserialize cost = 42ms

 

再继续看,发现还需要初始化writer和parser,所以改成这句

JSON.parseObject(JSON.toJSONString(new User()), User.class);

 

结果就很令人满意了

 

Type = fastjson
Serialize cost = 15ms
Deserialize cost = 18ms

 

 

结论: 如果你使用fastjson在一个短进程,换句话说只是少量的进行序列化反序列化,那么fastjson由于初始化需要的时间比较长,总体性能将会很糟糕。如果一定要用,有必要的话可以考虑手动进行初始化。

 

另,补上测试代码:

class User implements Serializable {
	private static final long serialVersionUID = -2513747641863637392L;

	User() {
	}
}

public class Test {
//	public static ParserConfig pc = new ParserConfig();
//	public static SerializeConfig sc = new SerializeConfig();

	public static void main(String[] args) throws UnknownHostException {
//		JSON.parseObject(JSON.toJSONString(new User()), User.class);
		String type = "json";
		System.out.println("Type = " + type);
		long start = new Date().getTime();
		byte[] b = serialize(new User(), type);
		long mid = new Date().getTime();
		System.out.println("Serialize cost = " + (mid - start));
		deserialize(b, type);
		System.out.println("Deserialize cost = " + (new Date().getTime() - mid));
	}

	public static byte[] serialize(User user, String type) {
		byte[] b = null;
		for (int i = 0; i < 1000; i++) {
			if ("java".equalsIgnoreCase(type)) {
				b = javaSerialize(user);
			} else if ("json".equalsIgnoreCase(type)) {
				b = jsonSerialize(user);
			}
		}
		return b;
	}

	public static User deserialize(byte[] b, String type) {
		User user = null;
		for (int i = 0; i < 1000; i++) {
			if ("java".equalsIgnoreCase(type)) {
				user = javaDeserialize(b);
			} else if ("json".equalsIgnoreCase(type)) {
				user = jsonDeserialize(b);
			}
		}
		return user;
	}

	public static byte[] jsonSerialize(User user) {
		return JSON.toJSONString(user).getBytes();
	}

	public static User jsonDeserialize(byte[] b) {
		return JSON.parseObject(new String(b), User.class);
	}

	public static byte[] javaSerialize(User user) {
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ObjectOutputStream os = new ObjectOutputStream(out);
			os.writeObject(user);
			return out.toByteArray();
		} catch (Exception e) {
			throw new SerializationException(e);
		}
	}

	public static User javaDeserialize(byte[] b) {
		try {
			ByteArrayInputStream in = new ByteArrayInputStream(b);
			ObjectInputStream is = new ObjectInputStream(in);
			return (User) is.readObject();
		} catch (Exception e) {
			throw new SerializationException(e);
		}
	}
}

 

 

 

 

fastjson初始化对性能的影响

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在Java里面,我们经常使用JSON格式的工具包对字符串或者对象进行解析,一般用得比较广泛的三种分别
新建一个数据库,将数据文件变为1000mb(以保证在实验中数据文件不会变化),日志文件大小设置为1mb
译自: http://www.mssqltips.com/sqlservertip/2749/sql-server-data-type-precedence/?utm_source
原文: SQLServer数据类型优先级对性能的影响 译自: http://www.mssqltips.com/sqlservertip/2749/sq
1.SQL Server系统数据库介绍 SQL Server有四个重要的系统级数据库:master,model,msdb,tempdb. maste
在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常。在消除了这些异常之后
陶炳哲 — MAY 12, 2015 在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常
问题: 我在我的应用程序中使用简单的查询/存储过程访问一个很大的表。但执行了很长时间。在where子
1.SQL Server系统数据库介绍 SQL Server有四个重要的系统级数据库:master,model,msdb,tempdb. maste
报文聚合对802.11n性能的影响 2009 年802.11n协议正式标准化,再一次实现了物理速率的提升,最高物
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号