Fastjson和Jackson序列化和讀取json的性能實測

偶然間看到的阿里出品的Fastjson,網上對這個json包好評如潮,性能勝Jackson10倍。
本人本着眼見爲實的想法,本身測試一下二者的性能比較。java

###測試### POJO對象名字爲User,具體代碼就不貼了,裏面有兩個屬性,分別是int類型的id和String類型的name,很簡單的一個類。算法

測試程序(只是簡單的測試下,這裏並未深究其中的各類構造方法)json

public class MyMain {
	private static final int TEST_CASE_NUM = 1000;
	public static void main(String args[]) throws IOException {

		List<User> users = new ArrayList<User>();
		Random random = new Random();

		for (int i = 0; i < TEST_CASE_NUM; i++) {
			User user = new User();
			user.setId(random.nextInt(10));
			user.setName("123");
			users.add(user);
		}

		Monitor.begin();
		for (User u : users){
			String s = JSON.toJSONString(u);
		}
		Monitor.end("serilization of fastjson");

		Monitor.begin();
                                    /**
		 * 這裏僅建立一個ObjectMapper實例
		 * 而網上的不少測試程序中,把實例的建立過程
		 * 加入到了for循環中,所以測出來的序列化性能
		 * 有10倍之差,其實其中大部分都消耗在了ObejectMapper
		 * 實例建立上。
		 */
		ObjectMapper objectMapper = new ObjectMapper();
		for (User u : users){
			String s = objectMapper.writeValueAsString(u);
		}
		long endjackson = System.currentTimeMillis();
		Monitor.end("serilization of jackson");


		List<String> strs = new ArrayList<String>();
		for (int j = 0; j < TEST_CASE_NUM; j++) {
			String s = new String("{\"id\":1,\"name\":\"123\"}");
			strs.add(s);
		}

		Monitor.begin();
		for (String s : strs){
			User user = JSON.parseObject(s,User.class);
		}
		Monitor.end("reading string by fastjson");

		Monitor.begin();
                                    ObjectMapper obj = new ObjectMapper();
		for (String s : strs){
			User user = obj .readValue(s,User.class);
		}
		Monitor.end("reading string by jackson");
	}
}

運行程序獲得輸出:app

serilization of fastjson use 158 ms
serilization of jackson use 339 ms
reading string by fastjson use 49 ms
reading string by jackson use 73 ms

屢次運行後結果相差甚微,比例關係基本保持穩定。因而可知fastjson並未如網上傳言那般,性能較之於jackson提高10倍。若是將ObjectMapper實例的建立過程也從計時器中提取出來,哪麼Jackson與fastjson的序列化性能幾乎相同。
然而在反序列方面,fastjson以巨大的優點領先Jackson,將測試的用例個數增長至1000000,獲得的輸出爲:dom

reading string by fastjson use 505 ms
reading string by jackson use 1051 ms

fastjson幾乎只須要Jackson的一半時間,這個表現至關亮眼。性能

在這裏咱們反序列化的字符串是按照實體類中屬性的順序排列的,若是打亂一下順序呢?
這裏仍是使用1000000個測試用例,獲得的輸出結果爲:測試

reading string by fastjson use 715 ms
reading string by jackson use 1049 ms

由於fastjson默認開啓了sort field martch優化算法,打亂順序以後性能降低,但仍然領先Jackson很多。優化

###總結### 此次測試使用的是1.9.31版本的Jackson和1.1.39版本的fasijson,測試結果表名fastjson和Jackson在序列化性能上相差不大(主要ObjectMapper類新建實例耗費很多時間),可是在反序列化方面,fastjson要明顯領先於Jackson。code

相關文章
相關標籤/搜索