fastjson、gson、jackson序列化和反序列化效能對比
阿新 • • 發佈:2018-12-26
注:相關依賴
<!-- 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();
}
}