`

fastjson与jackson的性能比较

阅读更多

本文仅作客观比较fastjson与jackson的性能测试,部分测试代码引自http://www.oschina.net/code/snippet_1156226_26432#44097 文中的方法,但是纠正了对于jackson的使用方式(需要写成单例先初始化,不要每次都new)。分别测试序列化1000,1万与10万次数据所花费的时间。

当然在此,如果大家发现文中的使用错误,也希望随时指出来帮助大家将优化做的更好。

测试代码均使用最新的jar包,而具体版本如下:

Jackson 2.x:

(这里仅测试Jackson2.x因为和1.x相比还是有些变化的,从包名就可以发现2.x变成com.fasterxml.jackson而不是1.x的org.codehaus.jackson希望大家注意区分)

jackson-annotations-2.4.1.jar

jackson-core-2.4.1.jar

jackson-databind-2.4.1.jar

 

fastjson

fastjson-1.1.41.jar

 

======================================================

------------------------------------以下为测试结果------------------------------

======================================================

预置条件1:循环1000次。

============序列化===========

序列化生成数据所用时间(秒):0.12

序列化Jackson所用时间(秒):0.077

序列化fastjson所用时间(秒):0.07

===========反序列化===========

反序列化生成数据所用时间(秒):0.095

反序列化Jackson所用时间(秒):0.114

反序列化fastjson所用时间(秒):0.149

-------------------------------------------------------------------------------------

预置条件2:循环10000次。

============序列化===========

序列化生成数据所用时间(秒):0.289

序列化Jackson所用时间(秒):0.281

序列化fastjson所用时间(秒):0.277

===========反序列化===========

反序列化生成数据所用时间(秒):0.344

反序列化Jackson所用时间(秒):0.416

反序列化fastjson所用时间(秒):0.445

-------------------------------------------------------------------------------------

预置条件3:循环100000次。

============序列化===========

序列化生成数据所用时间(秒):1.99

序列化Jackson所用时间(秒):0.855

序列化fastjson所用时间(秒):1.774

===========反序列化===========

反序列化生成数据所用时间(秒):2.69

反序列化Jackson所用时间(秒):1.33

反序列化fastjson所用时间(秒):1.606

 

以上对于10万条数据的测试可以看出jackson2.x在序列化上确实显现出了一些优势。

 

以下附代码(并附件打包):

/**
 * 主测试类
 */
package com.test;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;

/**
 *
 * @author guoyongxiang
 * Date: 2014-8-20
 */
public class JsonParseTest {
	
	public static void main(String[] args) throws IOException {
        System.out.println("============序列化===========");
        Monitoring.begin();
        List<Corp> list = new ArrayList<Corp>();
        for (int i = 0; i < 100000; i++) {
            list.add(fullObject(Corp.class));
        }
        Monitoring.end("序列化生成数据");
        
        // 排除首次初始化差异
        JacksonMapper.toJson(list.get(0));
        Monitoring.begin();
        jacksonSerialize(list);
        Monitoring.end("序列化Jackson");
        
        // 排除首次初始化差异
        JSON.toJSONString(list.get(0));
        Monitoring.begin();
        fastjsonSerialize(list);
        Monitoring.end("序列化fastjson");
        
        
        System.out.println("===========反序列化===========");
        
        List<String> jsonStrList = new ArrayList<String>();
        for (Corp corp : list) {
            String str = JacksonMapper.toJson(corp);
            jsonStrList.add(str);
        }
        Monitoring.end("反序列化生成数据");
        
        // 排除首次初始化差异
    	JacksonMapper.toObj(jsonStrList.get(0), Corp.class);
        Monitoring.begin();
        jacksonUnSerialize(jsonStrList);
        Monitoring.end("反序列化Jackson");
 
        // 排除首次初始化差异
        JSON.parseObject(jsonStrList.get(0), Corp.class);
        Monitoring.begin();
        fastjsonUnSerialize(jsonStrList);
        Monitoring.end("反序列化fastjson");
        
    }
	// ---------------------------------序列化---------------------------------
    public static void jacksonSerialize(List<Corp> list) throws JsonProcessingException {
        for (Corp corp : list) {
            String str = JacksonMapper.toJson(corp);
        }
    }
    
    public static void fastjsonSerialize(List<Corp> list) {
    	for (Corp corp : list) {
    		String str = JSON.toJSONString(corp);
    	}
    }
    // ---------------------------------反序列化---------------------------------
    public static void jacksonUnSerialize(List<String> list) throws IOException {
        for (String json : list) {
        	Corp corp = JacksonMapper.toObj(json, Corp.class);
        }
    }
 
    public static void fastjsonUnSerialize(List<String> list) {
    	for (String json : list) {
    		Corp corp = JSON.parseObject(json, Corp.class);
    	}
    }
    
    /**
     * 填充一个对象(一般用于测试)
     */
    public static <T> T fullObject(Class<T> cl) {
        T t = null;
        try {
            t = cl.newInstance();
            Method methods[] = cl.getMethods();
            for (Method method : methods) {
                // 如果是set方法,进行随机数据的填充
                if (method.getName().indexOf("set") == 0) {
                    Class<?> param = method.getParameterTypes()[0];
                    if (param.equals(String.class)) {
                        method.invoke(t, getRandomString(5));
                    } else if (param.equals(Short.class)) {
                        method.invoke(t, (short) new Random().nextInt(5));
                    } else if (param.equals(Float.class)) {
                        method.invoke(t, new Random().nextFloat());
                    } else if (param.equals(Double.class)) {
                        method.invoke(t, new Random().nextDouble());
                    } else if (param.equals(Integer.class)) {
                        method.invoke(t, new Random().nextInt(10));
                    } else if (param.equals(Long.class)) {
                        method.invoke(t, new Random().nextLong());
                    } else if (param.equals(Date.class)) {
                        method.invoke(t, new Date());
                    } else if (param.equals(Timestamp.class)) {
                        method.invoke(t, new Timestamp(System.currentTimeMillis()));
                    } else if (param.equals(java.sql.Date.class)) {
                        method.invoke(t, new java.sql.Date(System.currentTimeMillis()));
                    }
                }
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return t;
    }
    
    public static String getRandomString(int length) { //length表示生成字符串的长度
        String base = "abcdefghijklmnopqrstuvwxyz0123456789";   //生成字符串从此序列中取
        Random random = new Random();   
        StringBuffer sb = new StringBuffer();   
        for (int i = 0; i < length; i++) {   
            int number = random.nextInt(base.length());   
            sb.append(base.charAt(number));   
        }   
        return sb.toString();   
     }
}

 

计时器:

/**
 * 
 */
package com.test;

/**
 * 计时器
 * @author guoyongxiang
 * Date: 2014-8-20
 */
public class Monitoring {
	private static ThreadLocal<Long> begin = new ThreadLocal<Long>();
	 
    public static void begin() {
        begin.set(System.currentTimeMillis());
    }
 
    public static void end(String name) {
        double time = (System.currentTimeMillis() - begin.get()) / 1000.0;
        System.out.println(name + "所用时间(秒):" + time);
    }
}

 

测试对象

/**
 * 
 */
package com.test;

import java.sql.Timestamp;


/**
 * 对象
 * @author guoyongxiang
 * Date: 2014-8-20
 */
public class Corp {
	private Long uid;
    private Integer corpGrade;
    private Integer cityId;
    private String name;
    private String EName;
    private String description;
    private String zipCode;
    private String tel;
    private String fax;
    private String EMail;
    private Integer isEmailOpen;
    private Integer EMailChecked;
    private Timestamp regDateOnGov;
    private String backroll;
    private String address;
    private String webStoreUrl;
    private Integer isNew;
    private Integer credit;
    private Integer activeDegrees;
    private Integer hits;
    private Integer isHitsRecord;
    private Timestamp regTimeOnZfa;
    private Integer corpType;
    private Integer corpMajorcategoryId;
    private Integer businessRoleId;
    private String keyword;
    private Integer developState;
    private String isAlert;
    private Integer advMemState;
    private Integer advStockState;
    private Integer allianceState;
    private Timestamp lastUpdateTime;
    private Integer corpMajorcategoryId1;
    private String keyword1;
    private Long certificatePic;
    private Integer isUpdateCharter;
    private Integer currcount;
    private Integer curronsale;
    private Integer curronhot;
    private Integer currniccount;
    private Integer currniconsale;
    private Integer currniconhot;
    private String buyProducts;
    private Integer isOpenShop;
    private Integer state;
    private String mainProduct;
    private String advBrandIds;
    private String feature;
    private Integer category;
    private Integer contactFlag;
    private String fastPassage;
	
    // 省略getter/setter
}

 

jackson 工具类(默认设置,过多设置会降低效率而且很明显,如识别json中的单引号等)

package com.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 *  JacksonMapper
 *
 *  @author guoyongxiang
 */
public class JacksonMapper {

	private static final ObjectMapper mapper = new ObjectMapper();

	private JacksonMapper() {
	}

	public static ObjectMapper getInstance() {
		return mapper;
	}

	/**
	 * Object to Json String
	 * 
	 * @param obj
	 * @return
	 * @throws JsonProcessingException 
	 */
	public static String toJson(Object obj) throws JsonProcessingException {

		ObjectMapper mapper = JacksonMapper.getInstance();
		//SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
		//mapper.setDateFormat(df);
		return mapper.writeValueAsString(obj);
	}

	/**
	 * Json to List
	 * 
	 * @param <T>
	 * @param json
	 * @param clazz
	 * @return
	 * @throws IOException 
	 * @throws JsonMappingException 
	 * @throws JsonParseException 
	 */
	public static <T> List<T> toList(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
		ObjectMapper mapper = JacksonMapper.getInstance();
		//mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
		//mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
		List<T> list = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz));
		return list;
	}

	/**
	 * Json String to Object<br>
	 * String json = "..."; ObjectMapper mapper = JacksonMapper.getInstance();<br>
	 * YourBean bean = mapper.readValue(json, new YourBean().getClass());
	 * 
	 * @param json
	 * @param clazz
	 * @return 
	 * @throws IOException 
	 * @throws JsonMappingException 
	 * @throws JsonParseException 
	 */
	public static <T> T toObj(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException{
		ObjectMapper mapper = JacksonMapper.getInstance();
		//mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
		//mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
		return mapper.readValue(json, clazz);
	}
	
	/**
	 * JsonNode to Object
	 * @param node
	 * @param clazz
	 * @return
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	public static <T> T toObj(JsonNode node, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException{
		ObjectMapper mapper = JacksonMapper.getInstance();
		return mapper.readValue(node.toString(), clazz);
	}
	
	/**
	 * Json String to JsonNode
	 * @param json
	 * @return
	 * @throws JsonProcessingException
	 * @throws IOException
	 */
	public static JsonNode toNode(String json) throws JsonProcessingException, IOException{
		ObjectMapper mapper = JacksonMapper.getInstance();
		return mapper.readTree(json);
	}
	
	/**
	 * Object to JsonNode
	 * @param obj
	 * @return
	 * @throws JsonProcessingException
	 * @throws IOException
	 */
	public static JsonNode toNode(Object obj) throws JsonProcessingException, IOException{
		String json = toJson(obj);
		return toNode(json);
	}
}

 

分享到:
评论

相关推荐

    fastjson和jackson资源jar包

    在选择使用Fastjson还是Jackson时,需要根据项目的需求和特点来决定,例如性能敏感的应用可以选择Fastjson,而需要高级功能和灵活性的项目可能更适合Jackson。同时,确保使用与项目兼容且安全的库版本。

    JSON中fastjson、jackson、gson如何选择.docx

    本文将从性能、功能、易用性和社区支持四个方面比较 fastjson、jackson 和 gson,帮助读者更好地选择合适的 JSON解析器。 性能 fastjson 是阿里出品的 JSON 解析器,具有高性能和低内存占用的特点。fastjson 使用...

    Java四大json库gson+fastjson+jackson+json-lib

    Fastjson提供了简单直观的API,使得JSON与Java对象之间的转换变得异常简便。此外,它还支持JSON到Java对象的映射,以及JSON到XML的转换,适合于大量数据处理和性能敏感的应用场景。 3. Jackson: Jackson是另一个...

    Gson,jackson,fastjson性能测试

    主要针对常用的json工具Gson,jackson,fastjson进行性能测试,一个完整的工程,包含测试类、测试结论,以及三个工具包的jar文件。可以直接在eclipse中运行。具体版本如下: fastjson-1.1.28.jar gson-1.7.1.jar ...

    gson,fastjson,jackson简单使用

    在Java开发中,有三个流行的JSON库:Gson、Fastjson和Jackson,它们提供了方便快捷的方式来序列化和反序列化Java对象为JSON字符串。 **Gson库** Gson是由Google开发的库,它的主要功能是将Java对象转换为JSON字符...

    fastjson、gson、jackson序列化和反序列化所用 json

    在Java世界里,为了方便地处理JSON数据,有三个主流的库被广泛应用,即Fastjson、Gson和Jackson。这些库提供了JSON的序列化和反序列化功能,将Java对象转换为JSON字符串,以及将JSON字符串转换回Java对象。 1. **...

    例举fastJson和jackson转json的区别

    FastJson通常在性能方面优于Jackson,特别是在处理大量数据时,其解析速度更快。然而,这并不意味着在所有情况下都是如此,具体性能取决于JSON的结构和应用的需求。 4. **灵活性与兼容性** Jackson以其广泛的...

    FastJsonJar

    然而,值得注意的是,尽管FastJsonJar在性能上表现出色,但在某些特定场景下可能不如其他库如Gson或Jackson稳定,因此在实际使用时,应根据项目需求和具体场景选择合适的JSON库。 总的来说,FastJsonJar作为一款...

    fastjson-1.2.0.rar

    Fastjson以其高性能著称,而Jackson则以其全面的功能和灵活性受到青睐。它们都支持将Java对象转换为JSON字符串,反之亦然,且提供了丰富的API和配置选项。同时,这个压缩包中包含的不同版本的库可能意味着它是为了...

    fastjson-1.2.35.jar

    相比于Gson、Jackson等其他流行的JSON库,Fastjson在性能上占有一定优势,尤其是在大数据量处理时。同时,由于其API设计简洁,学习成本相对较低,使得它成为许多Java开发者首选的JSON库。 总结,Fastjson-1.2.35....

    JsonPerformanceVS:mson,jackson,FastJson,Gson,Json-Smart,org.json,json-lib

    主流JSON引擎性能比较(GSON,FASTJSON,JACKSON,JSONSMART) 前言 测试目的: Purpose 测试当前主流Json引擎的序列化与反序列化性能,包括JSON,FASTJSON,JACKSON and SMARTJSON。 Test the performance of the ...

    fastJSON_v2.1.1

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器 来自阿里巴巴的工程师开发 主要特点: 快速FAST 比其它任何基于Java的解析器和生成器更快 包括jackson) 强大(支持普通JDK类包括任意Java Bean ...

    fastjson1.2.9.zip

    与其他如Jackson、Gson等Java JSON库相比,Fastjson在速度上有优势,且API设计更符合中国开发者习惯,对于处理中文字符的支持也更为友好。然而,每个库都有其适用场景,选择时应结合项目需求进行评估。 五、集成与...

    fastjson(1.2.7)

    1. **高性能**:Fastjson在解析和生成JSON的过程中,采用了高效的算法,使得速度远超同类库,如Jackson、Gson等。 2. **简单易用**:API设计简洁,支持多种数据类型与JSON对象之间的相互转换,使得开发人员能够快速...

    FASTJSON2 是一个性能卓越的 Java JSON 库

    性能极致,性能远超过其他流行JSON库,包括jackson/gson/org.json支持JDK新特性,包括JDK 11/JDK 17,针对compact string优化,支持Record,支持GraalVM Native-Image。完善的JSONPath支持,支持SQL:2016的JSONPath...

    fastjson-1.2.47官方jar包下载

    Fastjson的性能优势显著,经过一系列基准测试,它在速度上超越了同类的Java JSON库,如Jackson、Gson等。这得益于其高效的算法设计和对Java虚拟机特性的深度利用。Fastjson的性能优化不仅体现在处理大规模数据时的...

    Json高性能包 FastJson

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还超越了google的二进制协议protocol buf。

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与ProtoBuf相关的`proto.exe`工具。 1. Gson(Google Gson): Gson是由Google提供的Java库,用于将Java对象转换为...

Global site tag (gtag.js) - Google Analytics