`
kane_xie
  • 浏览: 143159 次
社区版块
存档分类
最新评论

fastjson初始化对性能的影响

阅读更多

之前在项目中序列化是用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);
		}
	}
}

 

 

 

 

6
4
分享到:
评论
5 楼 kane_xie 2015-07-05  
793059909 写道
我的结果怎么和你的不一样:
Type = json
Serialize cost = 48ms
Deserialize cost = 49ms
Type = java
Serialize cost = 25ms
Deserialize cost = 56ms

Code:


因为writer和parser没有初始化,JSON.parseObject(JSON.toJSONString(new User()), User.class);
4 楼 793059909 2015-07-02  
https://github.com/alibaba/fastjson
不测不知道,一测吓一跳啊
3 楼 793059909 2015-07-02  
fastjson-1.2.6.jar
2 楼 793059909 2015-07-02  
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.UnknownHostException;
import java.util.Date;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializeConfig;

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 {
test("json");
test("java");
}

private static void test(String type) {
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) + "ms");
deserialize(b, type);
System.out.println("Deserialize cost = " + (new Date().getTime() - mid + "ms"));
}

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) {
return null;
}
}

public static User javaDeserialize(byte[] b) {
try {
ByteArrayInputStream in = new ByteArrayInputStream(b);
ObjectInputStream is = new ObjectInputStream(in);
return (User) is.readObject();
} catch (Exception e) {
return null;
}
}
}
1 楼 793059909 2015-07-02  
我的结果怎么和你的不一样:
Type = json
Serialize cost = 48ms
Deserialize cost = 49ms
Type = java
Serialize cost = 25ms
Deserialize cost = 56ms

Code:

相关推荐

    protostuff fastjson gson 高性能序列化jar包

    protostuff fastjson gson 高性能序列化jar包

    Fastjson-一款高性能的json解析工具

    Fastjson-一款高性能的json解析工具 来自ALIBABA-wenshao

    FastJson反序列化

    [{"listA":[{"id":"fds","name":"张三"},{"id":"fds","name":"李四"}],"test":"432"}, {"listA":[{"id":"fds","name":"张三"},{"id":"fds","name":"李四"}],...数组里面封装数组的反序列化方法,通过两个bean,进行封装

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用...

    fastJSON_v2.1.1

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器 来自阿里巴巴的工程师开发 主要特点: 快速FAST 比其它任何基于Java的解析器和生成器更快 包括jackson) 强大(支持普通JDK类包括任意Java Bean ...

    封装 fastjson 的json格式化工具

    封装 fastjson 的json格式化工具 ,在Controller返回的时候很好用,大家可以用一下,需要改进的地方,希望大家提出来

    fastjson与jackson的性能比较

    NULL 博文链接:https://gyx001.iteye.com/blog/2106364

    Gson,jackson,fastjson性能测试

    主要针对常用的json工具Gson,jackson,fastjson进行性能测试,一个完整的工程,包含测试类、测试结论,以及三个工具包的jar文件。可以直接在eclipse中运行。具体版本如下: fastjson-1.1.28.jar gson-1.7.1.jar ...

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器

    Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可用于将 JSON 字符串转换为等效的 Java 对象。Fastjson 可以使用任意 Java 对象,包括您没有源代码的预先存在的对象。

    fastjson和jackson序列化数据的区别

    fastjson和jackson序列化数据的区别直奔主题一言不合就上代码注意 直奔主题 1、fastjson将字符串反序列化为对象时,只会处理第一层,内部会序列化为JsonObject或者JsonArray,使用二级结构和三级结构时还要再次处理...

    Json高性能包 FastJson

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还超越了google的二进制协议protocol buf。

    com.alibaba/fastjson/1.2.4 fastjson

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。 主要特点: 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson”&gt;jackson) 强大(支持普通JDK类...

    fastjson定制工程,别名配置化

    原生的fastjson 字段别名只能通过代码hardcode , 这里我添加了别名的配置文件读取,这样适合在和第三方对接接口字段名经常变更的情况。

    Alibaba Fastjson Jar包

    Alibaba Fastjson Jar包官方版是可以帮助使用Fastjson功能的Fastjson jar包,Fastjson是一个Java语言编写的高性能功能完善的JSON库,当然必备Alibaba Fastjson Jar包官方版。

    fastjson-1.2.54-API文档-中文版.zip

    赠送jar包:fastjson-1.2.54.jar; 赠送原API文档:fastjson-1.2.54-javadoc.jar; 赠送源代码:fastjson-1.2.54-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    预警事项:Fastjson反序列化远程代码执行漏洞风险预警

    阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下...在默认配置下,当应用或系统用Fastjson对由用户可控的JSON字符串进行解析时,将可能导致远程代码执行的危害。攻击者利用该漏洞可实现在目标机器上的远程代码执行。

    fastjson-1.2.83.jar下载

    fastjson-1.2.83.jar下载,fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也支持从JSON字符串反序列化到JavaBean。fastjson采用全新的JSON解析算法,运行速度极快...

    fastjson.jar包

    Alibaba Fastjson Jar包是可以帮助使用Fastjson功能的Fastjson jar包,Fastjson是一个Java语言编写的高性能功能完善的JSON库,当然必备fastjson jar包。快速解析json神器,方便快捷的工具。

    fastjson-master.zip

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器

    fastjson-1.2.72-API文档-中文版.zip

    赠送jar包:fastjson-1.2.72.jar; 赠送原API文档:fastjson-1.2.72-javadoc.jar; 赠送源代码:fastjson-1.2.72-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

Global site tag (gtag.js) - Google Analytics