fastjson初始化对性能的影响(转)

标签: fastjson 初始化 性能 | 发表时间:2015-07-02 19:52 | 作者:xhmj12
出处:http://www.iteye.com

       转自:http://kane-xie.iteye.com/blog/2223837

 

       之前在项目中序列化是用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。然后我在测试案例中加入这两句

 

Java代码   收藏代码
  1. public static ParserConfig pc = new ParserConfig();  
  2. public static SerializeConfig sc = new SerializeConfig();  

 

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

 

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

 

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

Java代码   收藏代码
  1. JSON.parseObject(JSON.toJSONString(new User()), User.class);  

 

结果就很令人满意了

 

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

 

 

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

 

另,补上测试代码:

Java代码   收藏代码
  1. class User implements Serializable {  
  2.     private static final long serialVersionUID = -2513747641863637392L;  
  3.   
  4.     User() {  
  5.     }  
  6. }  
  7.   
  8. public class Test {  
  9. //  public static ParserConfig pc = new ParserConfig();  
  10. //  public static SerializeConfig sc = new SerializeConfig();  
  11.   
  12.     public static void main(String[] args) throws UnknownHostException {  
  13. //      JSON.parseObject(JSON.toJSONString(new User()), User.class);  
  14.         String type = "json";  
  15.         System.out.println("Type = " + type);  
  16.         long start = new Date().getTime();  
  17.         byte[] b = serialize(new User(), type);  
  18.         long mid = new Date().getTime();  
  19.         System.out.println("Serialize cost = " + (mid - start));  
  20.         deserialize(b, type);  
  21.         System.out.println("Deserialize cost = " + (new Date().getTime() - mid));  
  22.     }  
  23.   
  24.     public static byte[] serialize(User user, String type) {  
  25.         byte[] b = null;  
  26.         for (int i = 0; i < 1000; i++) {  
  27.             if ("java".equalsIgnoreCase(type)) {  
  28.                 b = javaSerialize(user);  
  29.             } else if ("json".equalsIgnoreCase(type)) {  
  30.                 b = jsonSerialize(user);  
  31.             }  
  32.         }  
  33.         return b;  
  34.     }  
  35.   
  36.     public static User deserialize(byte[] b, String type) {  
  37.         User user = null;  
  38.         for (int i = 0; i < 1000; i++) {  
  39.             if ("java".equalsIgnoreCase(type)) {  
  40.                 user = javaDeserialize(b);  
  41.             } else if ("json".equalsIgnoreCase(type)) {  
  42.                 user = jsonDeserialize(b);  
  43.             }  
  44.         }  
  45.         return user;  
  46.     }  
  47.   
  48.     public static byte[] jsonSerialize(User user) {  
  49.         return JSON.toJSONString(user).getBytes();  
  50.     }  
  51.   
  52.     public static User jsonDeserialize(byte[] b) {  
  53.         return JSON.parseObject(new String(b), User.class);  
  54.     }  
  55.   
  56.     public static byte[] javaSerialize(User user) {  
  57.         try {  
  58.             ByteArrayOutputStream out = new ByteArrayOutputStream();  
  59.             ObjectOutputStream os = new ObjectOutputStream(out);  
  60.             os.writeObject(user);  
  61.             return out.toByteArray();  
  62.         } catch (Exception e) {  
  63.             throw new SerializationException(e);  
  64.         }  
  65.     }  
  66.   
  67.     public static User javaDeserialize(byte[] b) {  
  68.         try {  
  69.             ByteArrayInputStream in = new ByteArrayInputStream(b);  
  70.             ObjectInputStream is = new ObjectInputStream(in);  
  71.             return (User) is.readObject();  
  72.         } catch (Exception e) {  
  73.             throw new SerializationException(e);  
  74.         }  
  75.     }  
  76. }  

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [fastjson 初始化 性能] 推荐:

fastjson初始化对性能的影响(转)

- - 移动开发 - ITeye博客
       转自:http://kane-xie.iteye.com/blog/2223837.        之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营. 对比了jackson,gson等框架之后,决定用fastjson,为什么呢,因为看名字感觉很快.

fastjson发布1.1.0版本

- tangfl - ITeye论坛最新精华讨论帖
这个版本引入了asm优化encode和decode的性能,使用了新的预测读取优化算法,大幅度提升了decode的性能. 这个版本没有bug fixed. [FASTJSON-51] - 提供按字段名称顺序输出,具体信息 http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=3637285.

Fastjson 安全更新,建议升级到 1.2.28 或更新版本

- - 开源中国社区最新新闻
最近发现 fastjson 在 1.2.24 以及之前版本存在高危安全漏洞,为了保证系统安全,请升级到 1.2.28 或者更新版本. 通过 maven 配置更新,使用最新版本,如下:. 1.2.28版本下载地址  http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.28/.

Java 类初始化顺序

- - Java - 编程语言 - ITeye博客
  对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是. 1.(静态变量、静态初始化块)注:这两个的初始化顺序为在类中先后出现的顺序. 2(变量、初始化块)注:这两个的初始化顺序为在类中先后出现的顺序.  我们也可以通过下面的测试代码来验证这一点:. public static String staticField = "静态变量";.

Spring 初始化2次的问题

- - 企业架构 - ITeye博客
在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常. 一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理.

java 类和对象的初始化

- - Web前端 - ITeye博客
  在Java中,类装载器把java类装载到虚拟机中,经过装载,链接和初始化三个步骤来完成. 其中链接中包括 校验、准备和解析. 下面对这些概念进行解析:. 装载:查找和导入类或接口的二进制数据,常用的是根据类的路径加载,还有根据网络的地址加载. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;.

(总结)Linux系统初始化优化Shell脚本

- 疯癫二楞子 - 服务器运维与网站架构|Linux运维|互联网研究
PS:本Shell脚本主要用于新安装Linux服务器系统的初始化工作,具体包括关闭ipv6模块、关闭selinux、让vim显示颜色、设置系统语言编码、优化系统服务、内核参数优化等. 可以根据自己的实际情况修改,可用于生产环境. 原作者是NetSeek,本人做了部分修改. cpuspeed | crond | irqbalance | microcode_ctl | mysqld | network | nginx | php-fpm | sendmail | sshd | syslog ).

Ubuntu init系统初始化流程分析

- - 有方网-一切如此简单
  现行的Linux distros主流的有两种init方式:一种是广为流传的System V initialization,它来源于Unix并且至今仍被各种Linux distros所采用;另一种是近几年提出的Upstart方式,基于事件机制,系统的所有服务,任务都是由事件驱动的. 据我所知,采用后一种方式的目前有Ubuntu(6.10 and later),Fedora(9.10 and later),Debian(optional).

类在什么时候加载和初始化

- - Java - 编程语言 - ITeye博客
理解类在JVM中什么时候被加载和初始化是Java编程语言中的基础概念,正因为有了Java语言规范,我们才可以清晰的记录和解释这个问题,但是很多Java程序员仍然不知道什么时候类被加载,什么时候类被初始化,类加载和初始化好像让人很困惑,对初学者难以理解,在这篇教程中我们将看看类加载什么时候发生,类和接口是如何被初始化的,我并不会拘泥于类加载器的细节或者说类加载器的工作方式.

java中一个对象的初始化过程

- - CSDN博客编程语言推荐文章
/* 该类演示了一个对象的初始化过程 */ class Person {. //堆内存默认初始化为null. private static String country="中国"; //静态属性,存在于方法区,随着类的加载而加载. System.out.println("静态代码块执行");. System.out.println("构造代码块执行");.