fastjson、gson、jackson序列化和反序列化性能对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31871785/article/details/71125311

注:相关依赖

    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.31</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.3</version>
    </dependency>

1. 序列化测试代码


/**
 * 测试fastjson gson jackson性能
 */
@Test
public void test1() throws JsonProcessingException {
    List<User> users = new ArrayList<User>();
    for (int i = 0; i < 100; i++) {
        User user = new User();
        user.setId(i);
        user.setUsername("张三"+i);
        user.setBirthday(new Date());
        users.add(user);
    }

    //测试gson用时
    Gson gson = new Gson();
    long start = new Date().getTime();
    gson.toJson(users);
    long end = new Date().getTime();
    System.out.println("gson转换共用时:"+(end-start)+"ms");

    //测试fastjson用时
    long start1 = new Date().getTime();
    JSON.toJSONString(users);
    long end1 = new Date().getTime();
    System.out.println("fastjson转换共用时:"+(end1-start1)+"ms");

    //测试jackson用时
    long start2 = new Date().getTime();
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValueAsString(users);
    long end2 = new Date().getTime();
    System.out.println("jackson转换共用时:"+(end2-start2)+"ms");
}

2. 测试结果

  • 100个对象(测试3次结果)
    • 第一次结果
      这里写图片描述
    • 第二次结果
      这里写图片描述
    • 第三次结果
      这里写图片描述

  • 10000个对象
    • 第一次结果
      这里写图片描述
    • 第二次结果
      这里写图片描述
    • 第三次结果
      这里写图片描述

  • 100000个对象
    • 第一次结果
      这里写图片描述
    • 第二次结果
      这里写图片描述
    • 第三次结果
      这里写图片描述

3. 测试结论

  • 100个对象转换,gson最快、fastjson其次、jackson最差 b.
  • 10000个对象转换,gson和fastjson耗时几乎一样,jackson最差
  • 100000个对象转换,fastjson最快、jackson其次、gson最差

4. 建议

  • 数据处理量小的情况下使用gson,数据量大的情况下使用fastjson

1. 反序列化测试代码

/**
 * 测试gson反序列化
 * 
 * 测试结果如下:
 *     1000000对象:
 *                 第一次4131ms
 *                 第二次4225ms
 *                 第三次4345ms
 *     10000个对象:
 *                 第一次77ms
 *                 第二次78ms
 *                 第三次71ms
 */
@Test
public void testGsonDeserialization() {
    try {
        BufferedReader reader = new BufferedReader(new FileReader("f:/json1.json"));
        String json = reader.readLine();

        // 测试gson的反序列化
        Gson gson = new Gson();
        long start = new Date().getTime();
        List<User> list = gson.fromJson(json, List.class);
        long end = new Date().getTime();
        System.out.println("使用gson:反序列化对象数目:" + list.size() + ", 用时:" + (end - start));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 测试fastjson反序列化
 * 
 * 测试结果如下:
 *  1000000对象:
 *              第一次3679ms
 *              第二次3783ms
 *              第三次2972ms
 *  10000对象:
 *              第一次247ms
 *              第二次229ms
 *              第三次240ms
 */
@Test
public void testFastJsonDeserialization(){
    try {
        BufferedReader reader = new BufferedReader(new FileReader("f:/json1.json"));
        String json = reader.readLine();
        // 测试fastjson反序列化
        long start1 = new Date().getTime();
        List<User> list1= (List<User>) JSON.parse(json);
        long end1 = new Date().getTime();
        System.out.println("使用fastjson:反序列化对象数目:"+list1.size()+", 用时:"+(end1-start1));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 测试jackson反序列化
 * 
 * 测试结果如下: 
 *  1000000个对象:
 *              第一次4239ms
 *              第二次4209ms
 *              第三次3671ms
 *  10000个对象:
 *              第一次107ms
 *              第二次114ms
 *              第三次122ms
 */
@Test
public void testJacksonDeserialization(){
    try {
        BufferedReader reader = new BufferedReader(new FileReader("f:/json1.json"));
        String json = reader.readLine();
        // 测试jackson反序列化
        ObjectMapper objectMapper = new ObjectMapper();
        long start2 = new Date().getTime();
        List<User> list2 = objectMapper.readValue(json, List.class);
        long end2 = new Date().getTime();
        System.out.println("使用jackjson:反序列化对象数目:" + list2.size() + ", 用时:" + (end2 - start2));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

所使用的json文件地址:http://download.csdn.net/download/qq_31871785/9848772

猜你喜欢

转载自blog.csdn.net/qq_31871785/article/details/71125311