成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ObjectMapper,別再像個傻子一樣一直New了!

開發 前端
由于ObjectMapper有很多的特性需要配置,你可能會為不同的應用場景分配一個單獨使用的ObjectMapper。總之,它的數量不需要太多,因為它是線程安全的。

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

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

就像下面這樣。

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

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

神奇。

這代碼有問題么?

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

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

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

new和不new,真的區別有那么大么?

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

證據?這得搬出Java中的基準測試工具JMH,才能一探究竟。

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

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

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

JMH測試結果

為了測試上面的場景,我們創造了下面的基準測試類。分為三個測試場景:

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

這樣的測試屬于cpu密集型的。我的cpu有10核,直接就分配了10個線程的并發,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();
}
}

測試結果如下。

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

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

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

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

當然,由于ObjectMapper有很多的特性需要配置,你可能會為不同的應用場景分配一個單獨使用的ObjectMapper。總之,它的數量不需要太多,因為它是線程安全的。

End

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

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

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2017-08-22 21:01:40

2015-07-15 09:29:27

UI設計

2022-09-26 08:30:41

黑客網絡攻擊隱私

2023-04-03 07:23:06

Java線程通信

2011-02-28 10:38:13

Windows 8

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運維

2009-06-12 15:26:02

2015-08-25 09:52:36

云計算云計算產業云計算政策

2013-01-11 18:10:56

軟件

2023-02-06 09:13:23

開源系統GoFrame V2

2020-06-23 08:10:30

Spring容器權限

2014-06-05 11:25:10

2023-04-05 14:19:07

FlinkRedisNoSQL

2024-12-02 00:00:02

Svelte 5effect?數據

2021-07-23 09:50:12

程序員技能開發者

2015-09-15 17:01:59

2021-11-29 18:34:14

內存異步死循環

2015-10-19 12:33:01

華三/新IT

2017-05-25 15:02:46

聯宇益通SD-WAN
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲色欲色欲www | 91影院| 羞羞视频网站 | 国产精品日本一区二区在线播放 | 久久国产秒 | 91视频免费在观看 | 精品1区2区 | 欧美成人免费在线视频 | 亚洲精品成人在线 | 中文字幕精品一区二区三区精品 | 国产成人精品视频 | 成人福利网站 | 日韩高清一区 | 国产黄色在线观看 | 精品久久久久久亚洲综合网 | 伊人伊成久久人综合网站 | 天天操夜夜爽 | 小视频你懂得 | 免费特级黄毛片 | 成人在线不卡 | 亚洲综合国产精品 | av网站在线免费观看 | 精品亚洲一区二区三区四区五区 | 涩涩视频在线观看 | 青青久久| 97伦理影院 | 九九在线| 国产精品久久久久久久久久 | 日韩欧美视频 | 久久久久久久久99 | 久久一区二区免费视频 | 久久综合久久综合久久 | 天天操天天天 | 在线中文字幕视频 | 黄色大片免费播放 | 亚洲一区二区三区桃乃木香奈 | 97色在线视频 | 精品国产视频 | 亚洲在线| 久久一二区 | 1000部精品久久久久久久久 |