JAXB工具类JAXBContext为什么耗时约来越高?
JAXB工具类 JAXBContext主要用来将实体类与xml字符串的转换,常见的使用方式如下:
但是在实际测试中发现,当并发线程达到一定量的时候会导致性能急剧下降,耗时增高,实际测试100次耗时结果如下:
原因为每次在调用该工具类时都会调用实例化实体类
JAXBContext context = JAXBContext.newInstance(obj.getClass());
通过源码反编译可以看到底层实现方式,每次都会生成一个新的实例。
随着线程数增大,该功能耗时会更高,测试结果如下:
10次 最高耗时:30毫秒、26毫秒、28毫秒
100次 最高耗时:1452毫秒、1816毫秒、1754毫秒
1000次 最高耗时:22787毫秒、25044毫秒、23137毫秒
很明显,随着使用线程数的增高,性能急剧下降。
解决方案:
将
JAXBContext context = JAXBContext.newInstance(obj.getClass());
改为
JAXBContext context = jAXBContextMap.get(obj.getClass().getName());
if (null == context) {
context = JAXBContext.newInstance(obj.getClass());
jAXBContextMap.put(obj.getClass().getName(), context);
}
将已经实例化的JAXBContext实例存储在map中,每次使用都先从map获取 若map中不存在则创建,并放入map。
测试一下,测试用例如下
实际测试结果:
方式一:如上面的测试结果。
方式二:
10次结果
1000次结果
根据测试结果可以看出,修改后的除第一次创建实例时候耗时外,后续都是无需耗时的。
根据测试结果可以看出,修改后的除第一次创建实例时候耗时外,后续都是无需耗时的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)