objectmapper和jsonobject,objectmapper 对象转json

  objectmapper和jsonobject,objectmapper 对象转json

  00-1010前言:这段代码有问题吗?JMH测试结果结束

  00-1010自从国内fastjson频频打雷之后,杰克逊json的使用越来越广泛。尤其是spring家族已经把它作为默认的JSON处理包,jackson的使用次数正在爆炸。

  很多同学发现jackson没有fastjson的JSON.parseObjec这样的方法,真的看起来很快。要解析json,您必须创建一个ObjectMapper来处理真正的解析操作。

  就像下面这样。

  public String getCarString(Car Car){ object mapper object mapper=new object mapper();string str=object mapper . writevalueasstring(car);返回字符串;}这种代码在CV工程师手里遍地开花。

  太神奇了。

  00-1010你要说有毛病,真的能正确执行。要说没事,在追求成绩的同学眼里肯定是十恶不赦的代码。

  通用工具类是单例的和线程安全的。ObjectMapper也不例外。它还是线程安全的,您可以毫无问题地并发执行它。

  这段代码ObjectMapper将在每次调用方法时生成一个。除了造成后辈一定的内存浪费之外,执行时间有没有瑕疵?

  新与不新真有那么大区别吗?

  有一次,xjjdog隐晦地指出了一个被频繁调用的代码问题,他的朋友们怒吼着拿出了证据。

  证据?我们必须跳出Java中的基准工具JMH来寻找答案。

  JMH(Java Micro Benchmark hark ness)就是这样一个可以进行基准测试的工具。如果您通过我们的一系列工具找到了热代码,如果您想测试其性能数据并评估改进,您可以将它交给JMH。其测量精度非常高,可达纳秒级。

  JMH是一个jar包,它非常类似于JUnit,一个单元测试框架,并且可以针对一些基本配置进行注释。其中许多配置可以由main方法的OptionsBuilder设置。

  上图显示了一个典型的JMH程序的内容。通过启动多个进程和线程,先预热,再迭代,最后汇总所有测试数据进行分析。在执行前后,还可以按照粒度进行一些前后操作的处理。

  00-1010为了测试上述场景,我们创建了以下基准测试类。分为三个测试场景:

  在直接方法中,新的ObjectMapper使用ThreadLocal全局共享一个ObjectMapper,每个线程都有一个ObjectMapper。

  这种测试是cpu密集型的。我的cpu有10个核心,直接分配了10个线程的并发。测试期间,cpu满负荷运行。

  @BenchmarkMode({Mode。throughput })@ output time unit(time unit。秒)@State(范围。Thread)@Warmup(迭代次数=5,时间=1,时间单位=时间单位。秒)@Measurement(迭代次数=5,时间=1,时间单位=时间单位)。秒)@ Fork(1)@ Threads(10)public class ObjectMapperTest { String JSON= { color : Black , type : BMW }@State(范围。Benchmark)公共静态类benchmark state { object mapper GLOBAL _ MAP=new object mapper();ThreadLocalObjectMapper GLOBAL _ MAP _ THREAD=new THREAD local();} @基准公共地图globalTest(BenchmarkState state)抛出异常{ Map map=state。GLOBAL_MAP.readValue(json,map . class);返回地图;} @基准公开地图globalTestThreadLocal(Benc

  hmarkState 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 UnitsObjectMapperTest.globalTest thrpt 5 25125094.559 ± 1754308.010 ops/sObjectMapperTest.globalTestThreadLocal thrpt 5 31780573.549 ± 7779240.155 ops/sObjectMapperTest.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有很多自定义的配置,使用全局的变量更能凸显它的优势。

 

  不要觉得这样做没有必要,保持良好的编码习惯永远是好的。高性能的代码都是点点滴滴积累起来的。不积跬步,无以至千里。不积小流,无以成江海,说的就是这个道理。

  以上就是使用ObjectMapper解析json不用一直new了的详细内容,更多关于ObjectMapper解析json的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: