fastJson和Jackson對比

今天在寫spring boot時妒蛇,發(fā)現(xiàn)spring默認帶的轉json包為jackson润绵,而一般都大家都會引入fastjson來替換孝治。
引入fastjson的方式為进倍,首先引入alibaba的fastjson包,然后在啟動類中繼承WebMvcConfigurerAdapter 重寫 configureMessageConverters

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        //1定義轉換器 converter
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        //配置fastjson
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //將fastjson 傳入轉換器
        converter.setFastJsonConfig(config);
        //將converter添加到converters當中
        converters.add(converter);
    }

為什么spring這么成熟的框架用的jackson而我們卻要改變?yōu)閒astjson呢螟左,難道fastjson真的就很fast啡浊?
我做了一個測試

 //Spring 中默認用到的是Jackson   在框架搭建的時候一般都改用fastJson
     public static void main(String [] str) {
         Map map = new HashMap<String,Object>();
         map = getMapData(map,1000000);
        long fastJsonBegin =  System.currentTimeMillis();
         JSONObject fastJson = new JSONObject();
        //fastJson
         System.out.println("fastJson-------------------------------------------------");
        // System.out.println("fastJson"+fastJson.toJSONString(map));
         fastJson.toJSONString(map);
         long fastJsonEnd =  System.currentTimeMillis();
         System.out.println("fastJson-------------time------------------------------------"+(fastJsonEnd-fastJsonBegin));
         //jackson
         long jacksonBegin =  System.currentTimeMillis();
         ObjectMapper jackson = new ObjectMapper();
         try {
             System.out.println("jackson-------------------------------------------------");
             //System.out.println("jackson"+jackson.writeValueAsString(map));
             jackson.writeValueAsString(map);
             long jacksonEnd =  System.currentTimeMillis();
             System.out.println("jackson-------------time------------------------------------"+(jacksonEnd-jacksonBegin));
         } catch (JsonProcessingException e) {
             e.printStackTrace();
         }
     }

     public static Map getMapData(Map map,int count) {
        for (int i = 0;i < count;i++) {
            map.put("a"+i,i);
        }
        return map;
     }

得到的運行結果

fastJson-------------------------------------------------
fastJson-------------time------------------------------------445
jackson-------------------------------------------------
jackson-------------time------------------------------------1123

果然是fastjson以快一倍的速度碾壓,于是我對上面的代碼進行了改動路狮,將獲取時間放在了創(chuàng)建fastjson及jackson的后面

//Spring 中默認用到的是Jackson   在框架搭建的時候一般都改用fastJson
     public static void main(String [] str) {
         Map map = new HashMap<String,Object>();
         map = getMapData(map,1000000);
         JSONObject fastJson = new JSONObject();
        long fastJsonBegin =  System.currentTimeMillis();

        //fastJson
         System.out.println("fastJson-------------------------------------------------");
        // System.out.println("fastJson"+fastJson.toJSONString(map));
         fastJson.toJSONString(map);
         long fastJsonEnd =  System.currentTimeMillis();
         System.out.println("fastJson-------------time------------------------------------"+(fastJsonEnd-fastJsonBegin));
         //jackson
         ObjectMapper jackson = new ObjectMapper();
         long jacksonBegin =  System.currentTimeMillis();

         try {
             System.out.println("jackson-------------------------------------------------");
             //System.out.println("jackson"+jackson.writeValueAsString(map));
             jackson.writeValueAsString(map);
             long jacksonEnd =  System.currentTimeMillis();
             System.out.println("jackson-------------time------------------------------------"+(jacksonEnd-jacksonBegin));
         } catch (JsonProcessingException e) {
             e.printStackTrace();
         }
     }

結果為

fastJson-------------------------------------------------
fastJson-------------time------------------------------------385
jackson-------------------------------------------------
jackson-------------time------------------------------------309

很明顯jackson的速度優(yōu)于fastjson虫啥,只是蔚约,在創(chuàng)建對象時fastjson比jactson快
我們看一下兩個的構造方法
fastjson

private static final long         serialVersionUID         = 1L;
    private static final int          DEFAULT_INITIAL_CAPACITY = 16;

    private final Map<String, Object> map;

    public JSONObject(){
        this(DEFAULT_INITIAL_CAPACITY, false);
    }
    public JSONObject(int initialCapacity, boolean ordered){
        if (ordered) {
            map = new LinkedHashMap<String, Object>(initialCapacity);
        } else {
            map = new HashMap<String, Object>(initialCapacity);
        }
    }

jackson

public ObjectMapper() {
        this(null, null, null);
    }

 public ObjectMapper(JsonFactory jf,
            DefaultSerializerProvider sp, DefaultDeserializationContext dc)
    {
        /* 02-Mar-2009, tatu: Important: we MUST default to using
         *   the mapping factory, otherwise tree serialization will
         *   have problems with POJONodes.
         * 03-Jan-2010, tatu: and obviously we also must pass 'this',
         *    to create actual linking.
         */
        if (jf == null) {
            _jsonFactory = new MappingJsonFactory(this);
        } else {
            _jsonFactory = jf;
            if (jf.getCodec() == null) { // as per [JACKSON-741]
                _jsonFactory.setCodec(this);
            }
        }
        _subtypeResolver = new StdSubtypeResolver();
        RootNameLookup rootNames = new RootNameLookup();
        // and default type factory is shared one
        _typeFactory = TypeFactory.defaultInstance();

        SimpleMixInResolver mixins = new SimpleMixInResolver(null);
        _mixIns = mixins;
        BaseSettings base = DEFAULT_BASE.withClassIntrospector(defaultClassIntrospector());
        _configOverrides = new ConfigOverrides();
        _serializationConfig = new SerializationConfig(base,
                    _subtypeResolver, mixins, rootNames, _configOverrides);
        _deserializationConfig = new DeserializationConfig(base,
                    _subtypeResolver, mixins, rootNames, _configOverrides);

        // Some overrides we may need
        final boolean needOrder = _jsonFactory.requiresPropertyOrdering();
        if (needOrder ^ _serializationConfig.isEnabled(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY)) {
            configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, needOrder);
        }
        
        _serializerProvider = (sp == null) ? new DefaultSerializerProvider.Impl() : sp;
        _deserializationContext = (dc == null) ?
                new DefaultDeserializationContext.Impl(BeanDeserializerFactory.instance) : dc;

        // Default serializer factory is stateless, can just assign
        _serializerFactory = BeanSerializerFactory.instance;
    }

這樣就一目了然的看到了耗時的原因

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奄妨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子苹祟,更是在濱河造成了極大的恐慌砸抛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件树枫,死亡現(xiàn)場離奇詭異直焙,居然都是意外死亡,警方通過查閱死者的電腦和手機砂轻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門奔誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事厨喂『痛耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵蜕煌,是天一觀的道長派阱。 經(jīng)常有香客問我,道長斜纪,這世上最難降的妖魔是什么贫母? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮盒刚,結果婚禮上腺劣,老公的妹妹穿的比我還像新娘。我一直安慰自己因块,他們只是感情好誓酒,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贮聂,像睡著了一般靠柑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吓懈,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天歼冰,我揣著相機與錄音,去河邊找鬼耻警。 笑死隔嫡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的甘穿。 我是一名探鬼主播腮恩,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼温兼!你這毒婦竟也來了秸滴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤募判,失蹤者是張志新(化名)和其女友劉穎荡含,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體届垫,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡释液,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了装处。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片误债。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出寝蹈,到底是詐尸還是另有隱情糟袁,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布躺盛,位于F島的核電站项戴,受9級特大地震影響,放射性物質發(fā)生泄漏槽惫。R本人自食惡果不足惜周叮,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望界斜。 院中可真熱鬧仿耽,春花似錦、人聲如沸各薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峭判。三九已至开缎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間林螃,已是汗流浹背奕删。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疗认,地道東北人完残。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像横漏,于是被迫代替她去往敵國和親谨设。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容