最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用ObjectMapper解析json不用一直new了

 更新時間:2022年06月14日 09:13:44   作者:小姐姐味道  
這篇文章主要為大家介紹了使用ObjectMapper解析json不用一直new了的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

自從國產(chǎn)之光fastjson頻頻暴雷,jackson json的使用是越來越廣泛了。尤其是spring家族把它搞成了默認(rèn)的JSON處理包,jackson的使用數(shù)量更是呈爆炸式發(fā)展。

很多同學(xué)發(fā)現(xiàn),jackson并沒有類似fastjson的JSON.parseObjec這樣的,確實看起來很快的方法。要想解析json,你不得不new一個ObjectMapper,來處理真正的解析動作。

就像下面這樣。

public String getCarString(Car car){
    ObjectMapper objectMapper = new ObjectMapper();
    String str = objectMapper.writeValueAsString(car);
    return str;
}

這種代碼就在CV工程師手中遍地開了花。

神奇。

這代碼有問題么?

你要說它有問題,它確實能正確的執(zhí)行。你要說它沒問題,在追求性能的同學(xué)眼里,這肯定是一段十惡不赦的代碼。

一般的工具類,都是單例的,同時是線程安全的。ObjectMapper也不例外,它也是線程安全的,你可以并發(fā)的執(zhí)行它,不會產(chǎn)生任何問題。

這段代碼,ObjectMapper在每次方法調(diào)用的時候,都會生成一個。那它除了造成一定的年輕代內(nèi)存浪費之外,在執(zhí)行時間上有沒有什么硬傷呢?

new和不new,真的區(qū)別有那么大么?

有一次,xjjdog隱晦的指出某段被頻繁調(diào)用的代碼問題,被小伙伴怒吼著拿出證據(jù)。

證據(jù)?這得搬出Java中的基準(zhǔn)測試工具JMH,才能一探究竟。

JMH(the Java Microbenchmark Harness) 就是這樣一個能夠做基準(zhǔn)測試的工具。如果你通過我們一系列的工具,定位到了熱點代碼,要測試它的性能數(shù)據(jù),評估改善情況,就可以交給JMH。它的測量精度非常高,最高可達到納秒的級別。

JMH是一個jar包,它和單元測試框架JUnit非常的像,可以通過注解進行一些基礎(chǔ)配置。這部分配置有很多是可以通過main方法的OptionsBuilder進行設(shè)置的。

上圖是一個典型的JMH程序執(zhí)行的內(nèi)容。通過開啟多個進程,多個線程,首先執(zhí)行預(yù)熱,然后執(zhí)行迭代,最后匯總所有的測試數(shù)據(jù)進行分析。在執(zhí)行前后,還可以根據(jù)粒度處理一些前置和后置操作。

JMH測試結(jié)果

為了測試上面的場景,我們創(chuàng)造了下面的基準(zhǔn)測試類。分為三個測試場景:

  • 直接在方法里new ObjectMapper
  • 在全局共享一個ObjectMapper
  • 使用ThreadLocal,每個線程一個ObjectMapper

這樣的測試屬于cpu密集型的。我的cpu有10核,直接就分配了10個線程的并發(fā),cpu在測試期間跑的滿滿的。

@BenchmarkMode({Mode.Throughput})
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@Threads(10)
public class ObjectMapperTest {
    String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
    @State(Scope.Benchmark)
    public static class BenchmarkState {
        ObjectMapper GLOBAL_MAP = new ObjectMapper();
        ThreadLocal<ObjectMapper> GLOBAL_MAP_THREAD = new ThreadLocal<>();
    }
    @Benchmark
    public Map globalTest(BenchmarkState state) throws Exception{
        Map map = state.GLOBAL_MAP.readValue(json, Map.class);
        return map;
    }
    @Benchmark
    public Map globalTestThreadLocal(BenchmarkState state) throws Exception{
        if(null == state.GLOBAL_MAP_THREAD.get()){
            state.GLOBAL_MAP_THREAD.set(new ObjectMapper());
        }
        Map map = state.GLOBAL_MAP_THREAD.get().readValue(json, Map.class);
        return map;
    }
    @Benchmark
    public Map localTest() throws Exception{
        ObjectMapper objectMapper = new ObjectMapper();
        Map map = objectMapper.readValue(json, Map.class);
        return map;
    }
    public static void main(String[] args) throws Exception {
        Options opts = new OptionsBuilder()
                .include(ObjectMapperTest.class.getSimpleName())
                .resultFormat(ResultFormatType.CSV)
                .build();
        new Runner(opts).run();
    }
}

測試結(jié)果如下。

Benchmark                                Mode  Cnt         Score         Error  Units
ObjectMapperTest.globalTest             thrpt    5  25125094.559 ± 1754308.010  ops/s
ObjectMapperTest.globalTestThreadLocal  thrpt    5  31780573.549 ± 7779240.155  ops/s
ObjectMapperTest.localTest              thrpt    5   2131394.345 ±  216974.682  ops/s

從測試結(jié)果可以看出,如果我們每次調(diào)用都new一個ObjectMapper,每秒可以執(zhí)行200萬次JSON解析;如果全局使用一個ObjectMapper,則每秒可以執(zhí)行2000多萬次,速度足足快了10倍。

如果使用ThreadLocal的方式,每個線程給它分配一個解析器,則性能會有少許上升,但也沒有達到非常夸張的地步。

所以在項目中寫代碼的時候,我們只需要保證有一個全局的ObjectMapper就可以了。

當(dāng)然,由于ObjectMapper有很多的特性需要配置,你可能會為不同的應(yīng)用場景分配一個單獨使用的ObjectMapper??傊?,它的數(shù)量不需要太多,因為它是線程安全的。

End

所以結(jié)論就比較清晰了,我們只需要在整個項目里使用一個ObjectMapper就可以了,沒必要傻不拉幾的每次都new一個,畢竟性能差了10倍。如果你的JSON有很多自定義的配置,使用全局的變量更能凸顯它的優(yōu)勢。

不要覺得這樣做沒有必要,保持良好的編碼習(xí)慣永遠(yuǎn)是好的。高性能的代碼都是點點滴滴積累起來的。不積跬步,無以至千里。不積小流,無以成江海,說的就是這個道理。

以上就是使用ObjectMapper解析json不用一直new了的詳細(xì)內(nèi)容,更多關(guān)于ObjectMapper解析json的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

  • ConditionalOnProperty配置swagger不生效問題及解決

    ConditionalOnProperty配置swagger不生效問題及解決

    這篇文章主要介紹了ConditionalOnProperty配置swagger不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringMVC 攔截器不攔截靜態(tài)資源的三種處理方式方法

    SpringMVC 攔截器不攔截靜態(tài)資源的三種處理方式方法

    本篇文章主要介紹了SpringMVC 攔截器不攔截靜態(tài)資源的三種處理方式方法,詳細(xì)的介紹了三種方法,有興趣的可以了解一下。
    2017-01-01
  • 關(guān)于JVM垃圾回收的java.lang.ref.Finalizer問題

    關(guān)于JVM垃圾回收的java.lang.ref.Finalizer問題

    這篇文章主要介紹了關(guān)于JVM垃圾回收的java.lang.ref.Finalizer問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • RequestContextHolder.getRequestAttributes()空指針問題及解決

    RequestContextHolder.getRequestAttributes()空指針問題及解決

    這篇文章主要介紹了RequestContextHolder.getRequestAttributes()空指針問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot中Token登錄授權(quán)、續(xù)期和主動終止的方案流程分析

    SpringBoot中Token登錄授權(quán)、續(xù)期和主動終止的方案流程分析

    SpringBoot項目中,基于Token的登錄授權(quán)方案主要有兩種:利用Session/Cookie和JWT,Cookie/Session方案有狀態(tài),不適合分布式架構(gòu),而JWT雖無狀態(tài),但存在過期時間不可強制失效、一次性等缺點,本文介紹SpringBoot中Token登錄授權(quán)、續(xù)期和主動終止的方案,感興趣的朋友一起看看吧
    2024-09-09
  • java實現(xiàn)即賦值也判斷的寫法示例

    java實現(xiàn)即賦值也判斷的寫法示例

    這篇文章主要為大家介紹了java實現(xiàn)即賦值也判斷的寫法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Spring boot 應(yīng)用實現(xiàn)動態(tài)刷新配置詳解

    Spring boot 應(yīng)用實現(xiàn)動態(tài)刷新配置詳解

    這篇文章主要介紹了spring boot 配置動態(tài)刷新實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • java接口冪等性的實現(xiàn)方式

    java接口冪等性的實現(xiàn)方式

    本文介紹了在不同層面上實現(xiàn)Java接口冪等性的方法,包括使用冪等表、Nginx+Lua和Redis、以及SpringAOP,通過這些方法,可以確保接口在多次請求時只執(zhí)行一次,避免重復(fù)處理和數(shù)據(jù)不一致,每種方法都有其適用場景和優(yōu)勢,通過實際測試驗證了冪等性邏輯的有效性
    2025-01-01
  • Java常用工具類匯總 附示例代碼

    Java常用工具類匯總 附示例代碼

    這篇文章主要介紹了Java常用工具類匯總 附示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)

    java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)

    這篇文章主要介紹了java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評論

隆尧县| 遵化市| 子长县| 大姚县| 漳平市| 临湘市| 梓潼县| 兴文县| 安宁市| 新竹县| 屏东县| 灵武市| 攀枝花市| 贵南县| 南涧| 武胜县| 峡江县| 正阳县| 油尖旺区| 新乡市| 隆林| 扶沟县| 武安市| 衡南县| 静宁县| 廉江市| 景谷| 延吉市| 阳江市| 岐山县| 宁海县| 天镇县| 临城县| 兴和县| 博爱县| 慈利县| 翁源县| 波密县| 新源县| 松桃| 贵州省|