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

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:

相关推荐

    fastjson-1.2.70.jar.zip

    1. **安全模式**:为防止恶意JSON数据注入,Fastjson提供了安全模式,可以在初始化时开启。 2. **日期格式化**:在序列化和反序列化日期时,需要指定合适的日期格式。 3. **内存管理**:对于大对象或大数据量,考虑...

    springboot2.0整合fastjson以及各种使用实例

    SpringBoot 2.0 整合 Fastjson 是一个常见的任务,因为Fastjson是阿里巴巴提供的一款高性能的JSON库,它能够方便地进行Java对象与JSON数据之间的转换。在SpringBoot项目中,Fastjson可以帮助我们快速处理JSON格式的...

    com.alibaba.fastjson.JSONArray依赖jar.rar

    1. **JSONArray的创建与初始化** - 创建JSONArray最常见的方式是通过`JSONArray.parseArray(String jsonString)`方法,将JSON字符串解析为JSONArray实例。 - 另外,也可以直接通过构造函数`new JSONArray()`创建一...

    SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    在`RedisConfiguration`类中,我们创建一个@Bean方法,用于初始化`RedisTemplate`并设置序列化器: ```java @Configuration public class RedisConfiguration { @Bean public RedisTemplate, Object&gt; ...

    springmvc 配置fastjson

    这时,可以在`FastjsonHttpMessageConverter`类中初始化Fastjson的`JSONSerializerFeature`和`JSONParserFeature`,并将其传递给`JSON.toJSONString()`或`JSON.parseObject()`方法。 5. **测试与使用**: 配置完成...

    fastjson常用方法

    // 假设group已经初始化完成 String jsonString = JSON.toJSONString(group); System.out.println("jsonString: " + jsonString); ``` **应用场景:** 主要用于将Java对象序列化为JSON字符串,便于在网络中传输或...

    springboot-fastjson-auto-transform-enum.zip

    只需要在`pom.xml`或`build.gradle`中添加Fastjson的依赖,并在项目启动时,Fastjson就会自动初始化并提供服务。 3. **枚举(Enum)序列化和反序列化** JSON标准不支持枚举类型,因此在序列化枚举时,需要特殊处理...

    C#简单快速的json组件fastJSON使用介绍

    对于类的构造函数,FastJSON会生成直接调用无参构造函数的IL代码,而对于结构体(`struct`),它会生成初始化对象并将其装箱的IL代码。 这种做法大大提高了FastJSON的性能,尤其是在大量序列化和反序列化操作的情况...

    Volley,FastJson,.解析网络Json,多线程显示图片。图片缓存,解决图片对不上文字,图片排序混乱问题,万能适配器

    // 构造函数,初始化items列表 @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext())....

    SpringBoot如何使用Fastjson解析Json数据

    Fastjson是阿里巴巴开源的一个高性能的Java语言编写的Json处理库,它可以将Java对象转换成Json格式的字符串,反之亦然。在SpringBoot项目中使用Fastjson来解析Json数据是一种常见且高效的做法。 在SpringBoot项目中...

    spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    Objenesis可以跳过初始化过程,直接创建一个未初始化的对象,这对于Spring的依赖注入和测试场景非常有用。 当我们从GitHub上下载Spring框架的源码进行学习或开发时,这两个库可能并不包含在源码包内,因为它们通常...

    springJar下载

    Spring还包含了Spring MVC,用于构建RESTful Web服务,以及Spring Boot,简化了初始化和配置过程。 2. **Fastjson**:Fastjson是阿里巴巴开发的JSON解析库,支持Java到JSON和JSON到Java的转换。它的性能卓越,解析...

    android okhttp网络框架

    - 一个OkHttpClient的配置类,用于初始化连接池、超时时间等。 - 网络请求的工具类,封装了OkHttp的请求方法,可能有get()、post()等。 - Fastjson的相关工具类,用于解析JSON数据。 - 接口定义,每个接口对应一个...

    sofa-rpc,SOFARPC是一种高性能、高扩展性、生产级的Java RPC框架。.zip

    同时,它也支持基于Spring Boot的快速集成,简化了项目的初始化和配置工作。 压缩包中的"sofa-rpc-master"可能包含了SOFARPC的源代码仓库,这对于开发者来说是一个很好的学习资源。通过阅读和研究源码,可以深入...

    00、SpringBoot入门.rar

    在SpringBoot中,我们通常使用Spring Initializr来初始化一个新的项目。这是一个在线工具,也可以通过IntelliJ IDEA或Eclipse等集成开发环境(IDE)的插件来使用。在这里,你可以选择所需的依赖,如Web、Data JPA等...

    Json开发包

    为了更好地利用JSON开发包,你需要熟悉所选库的API文档,了解如何初始化、配置和使用相关类。此外,学习使用JSON Path或JSON Schema等工具,可以帮助你更高效地查询和验证JSON数据。 总之,JSON作为数据交换的通用...

    ztree最简单的后台传前台例子

    1. 前端:在HTML页面中,引入ZTree的CSS样式文件和JavaScript脚本文件,然后初始化ZTree,设置相应的配置参数,如树节点的数据URL(指向Servlet的URL)。 2. 后端(Servlet):当接收到前端的请求时,Servlet会执行...

    Nacos源码解析流程图

    - **启动流程**:Nacos Server启动时,会初始化数据库连接、日志系统、服务器端口监听等。核心组件包括NamingService、ConfigService、健康检查线程等。 - **服务注册**:服务提供者启动时,通过NamingService接口...

    dorado:基于Netty4开发的简单,轻量级,高性能的HTTP Restful API服务器

    多拉多 ...产品特点 ...内置JSON / Protobuf序列化支持,JSON序列化框架使用Fastjson,依赖内置;如果使用protobuf序列化,需要自行...Spring框架支持,默认支持注解方式初始化spring容器 SpringBoot集成 集成swagger restf

    springboot+mybatis+mysql

    这个项目利用了JDK 1.8的新特性,同时也对日志系统进行了配置,使用了Fastjson替代Jackson作为JSON处理库,并且引入了Mybatis的分页插件,大大简化了数据库分页操作。 首先,Spring Boot是由Pivotal团队提供的全新...

Global site tag (gtag.js) - Google Analytics