json-lib 与Jackson性能对比
2014-09-18 16:27
387 查看
由于打算采用redis缓存接收到的数据,而接收到的数据解析后的结果是一个Map,希望利用redis缓存该Map,而redis中能接收的数据类型为String与byte数组,考虑再三,决定采用String存储,对于Map转String存储,以及反转,我首先想到的是json字符串的方式存储(虽然后来与一位朋友沟通后表示google的protobuf可能性能与内存占用上可能更佳),下面是测试结果:
Map大小为13,占1548个字节,单线程转换10000次,并反转,结果如下:
MapToJson.java
一个辅助类 JsonDateValueProcessor.java
Map大小为13,占1548个字节,单线程转换10000次,并反转,结果如下:
----------json-lib--------------- Map转字符串耗时:5540.254697 字符串转Map耗时:14268.4411 --------Jackson------------------ Map转字符串耗时:962.843043 字符串转Map耗时:530.927814以下为测试代码:
MapToJson.java
package com.json.test; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import com.fasterxml.jackson.databind.ObjectMapper; public class MapToJson { /** * 模拟的OBD数据上报(10数据+3基站) */ public static Map<String,Object> obdDataMap; public static List<String> obdDataList = new ArrayList<String>(); public static ObjectMapper mapper = new ObjectMapper(); public static int COUNT = 10000; public static JsonConfig jsonConfig; static{ init(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor()); jsonConfig.registerJsonValueProcessor(java.sql.Date.class, new JsonDateValueProcessor()); } static void init(){ obdDataMap = new HashMap<String, Object>(); List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); Map<String,Object> dataMap = null; Map<String,Object> obdMap = null; for(int i=0;i<10;i++){ dataMap = new HashMap<String, Object>(); obdMap = new HashMap<String,Object>(); obdMap.put("GATHERTIME", new Date()); obdMap.put("PID_010B", 43); obdMap.put("PID_010C", 784.25d); obdMap.put("OBD_SPEED", 12); obdMap.put("PID_010F", 53); dataMap.put("obdData", obdMap); dataList.add(dataMap); } for(int i=0;i<3;i++){ dataMap = new HashMap<String, Object>(); obdMap = new HashMap<String,Object>(); obdMap.put("CELL_ID", "22253"); obdMap.put("MOBILE_COUNTRY_CODE", "460"); obdMap.put("LOCATION_AREA_CODE", "22528"); obdMap.put("MOBILE_NETWORK_CODE", "0"); obdMap.put("SIGNAL_STRENGTH", "38"); dataMap.put("cellTowerData", obdMap); dataList.add(dataMap); } obdDataMap.put("sourceData", dataList); } public static void mapToStr(){ long t0 = System.nanoTime(); JSONObject json = null; for(int i=0;i<COUNT;i++){ //10000 json = JSONObject.fromObject(obdDataMap,jsonConfig); obdDataList.add(json.toString()); // System.out.println(json.toString().length()); } long t1 = System.nanoTime(); System.out.println("Map转字符串耗时:"+(t1-t0)/1000000.0); } public static void mapToStr2() throws IOException{ long t0 = System.nanoTime(); String str = null; for(int i =0;i<COUNT;i++){ str = mapper.writeValueAsString(obdDataMap); obdDataList.add(str); // System.out.println(str); } long t1 = System.nanoTime(); System.out.println("Map转字符串耗时:"+(t1-t0)/1000000.0); } public static void strToMap(){ long t0 = System.nanoTime(); List<JSONObject> jsonArray = JSONArray.fromObject(obdDataList,jsonConfig); Map<String,Object> map; for(JSONObject obj:jsonArray){ map = (Map<String, Object>) obj; // System.out.println(map); } long t1 = System.nanoTime(); System.out.println("字符串转Map耗时:"+(t1-t0)/1000000.0); } public static void strToMap2() throws IOException{ long t0 = System.nanoTime(); Map<String,Object> map = null; for(String str:obdDataList){ map = mapper.readValue(str, Map.class); // System.out.println(map); } long t1 = System.nanoTime(); System.out.println("字符串转Map耗时:"+(t1-t0)/1000000.0); } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { System.out.println("----------json-lib---------------"); mapToStr(); strToMap(); obdDataList.clear(); System.out.println("--------Jackson------------------"); mapToStr2(); strToMap2(); } }
一个辅助类 JsonDateValueProcessor.java
package com.json.test; import java.text.DateFormat; import java.text.SimpleDateFormat; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; /**************************************************************************** * com.sides.pub.util JsonDateValueProcessor.java Created on 2013-9-16 * @Author: linfenliang * @Description: 该类主要将日期类型(java.util.Date与java.sql.Date)格式化为yyyy-MM-dd HH:mm:ss字符串 * @Version: 1.0 ***************************************************************************/ public class JsonDateValueProcessor implements JsonValueProcessor { private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 将日期类型(java.util.Date与java.sql.Date)格式化为yyyy-MM-dd HH:mm:ss字符串 * @author linfenliang */ public JsonDateValueProcessor() { super(); } @Override public Object processArrayValue(Object arg0, JsonConfig arg1) { return process(arg0); } @Override public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) { return process(arg1); } private Object process(Object value) { try { if (value instanceof java.util.Date || value instanceof java.sql.Date) { return dateFormat.format(value); } return value == null ? "" : value.toString(); } catch (Exception e) { return ""; } } }
相关文章推荐
- 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
- 三款JSON类库Jackson,Gson与JSON-lib的性能对比
- 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
- Jackson、JSON-lib、Gson性能对比
- 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
- 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
- Jackson、JSON-lib、Gson性能对比
- Jackson、JSON-lib、Gson性能对比
- json-lib 和 jackson 性能对比
- 两款JSON类库Jackson与JSON-lib的性能对比
- json-lib 与Jackson性能对比
- 三款JSON类库Jackson,Gson与JSON-lib的性能对比
- (转)JSON类库Jackson、Gson与JSON-lib的性能对比
- Jackson、JSON-lib、Gson性能对比
- 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
- json性能对比 fastjson jackson
- json-lib和jackson进行Java对象到json字符串序列化性能比较
- FastJSON、Gson和Jackson性能对比
- FastJSON、Gson和Jackson性能对比
- gson和jackson生成json简单性能对比