关于JSONObject的性能问题
现有一段代码:
private JSONObject override(User user, UserVO vo) {
String json = JSON.toJSONString(vo);
JSONObject o = JSON.parseObject(json);
JSONObject name = new JSONObject();
if (StringUtils.isNotBlank(user.getName())) {
name = JSON.parseObject(user.getName());
o.put("name", name);
}
}
这段代码就是将一个VO对象转JSON字符串之后再转为对象,然后将User对象中的name属性转为对象,最后通过put方法获取到这个它。
其实这个逻辑是没问题的,不过我们可以尝试测试它的运行速度,
这是一段简单的测试代码:
public static void main(String[] args) {
User user = new User();
long start = System.currentTimeMillis();
String json = JSON.toJSONString(user);
JSONObject o = JSON.parseObject(json);
long end = System.currentTimeMillis();
System.out.println("用时:"+(end - start) + "ms");
}
为了避免测试偶然性,采用多次测试:
第一次:331ms
第二次:348ms
第三次:367ms
第四次:328ms
第五次:307ms
第六次:383ms
可以发现,就这样一个简单的转换,竟然用时在300ms以上。
点进 parseObject() 查看原因:
public static JSONObject parseObject(String text) {
Object obj = parse(text);
if (obj instanceof JSONObject) {
return (JSONObject)obj;
} else {
try {
return (JSONObject)toJSON(obj);
} catch (RuntimeException var3) {
throw new JSONException("can not cast to JSONObject.", var3);
}
}
}
方法内第一行开始解析传入的参数,再往里面点,发现仅仅一步解析,就走了很多方法。
然后是toJSON():
public static Object toJSON(Object javaObject, SerializeConfig config) {
if (javaObject == null) {
return null;
} else if (javaObject instanceof JSON) {
return javaObject;
} else {
JSONObject json;
int len;
if (javaObject instanceof Map) {
Map<Object, Object> map = (Map)javaObject;
len = map.size();
Object innerMap;
if (map instanceof LinkedHashMap) {
innerMap = new LinkedHashMap(len);
} else if (map instanceof TreeMap) {
innerMap = new TreeMap();
} else {
innerMap = new HashMap(len);
}
json = new JSONObject((Map)innerMap);
Iterator var24 = map.entrySet().iterator();
while(var24.hasNext()) {
Entry<Object, Object> entry = (Entry)var24.next();
Object key = entry.getKey();
String jsonKey = TypeUtils.castToString(key);
Object jsonValue = toJSON(entry.getValue(), config);
json.put(jsonKey, jsonValue);
}
return json;
} else {
Object item;
if (javaObject instanceof Collection) {
Collection<Object> collection = (Collection)javaObject;
JSONArray array = new JSONArray(collection.size());
Iterator var19 = collection.iterator();
while(var19.hasNext()) {
Object item = var19.next();
item = toJSON(item, config);
array.add(item);
}
return array;
} else if (javaObject instanceof JSONSerializable) {
String json = toJSONString(javaObject);
return parse(json);
} else {
Class<?> clazz = javaObject.getClass();
if (clazz.isEnum()) {
return ((Enum)javaObject).name();
} else if (clazz.isArray()) {
len = Array.getLength(javaObject);
JSONArray array = new JSONArray(len);
for(int i = 0; i < len; ++i) {
item = Array.get(javaObject, i);
Object jsonValue = toJSON(item);
array.add(jsonValue);
}
return array;
} else if (ParserConfig.isPrimitive2(clazz)) {
return javaObject;
} else {
ObjectSerializer serializer = config.getObjectWriter(clazz);
if (serializer instanceof JavaBeanSerializer) {
JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer)serializer;
json = new JSONObject();
try {
Map<String, Object> values = javaBeanSerializer.getFieldValuesMap(javaObject);
Iterator var7 = values.entrySet().iterator();
while(var7.hasNext()) {
Entry<String, Object> entry = (Entry)var7.next();
json.put((String)entry.getKey(), toJSON(entry.getValue(), config));
}
return json;
} catch (Exception var11) {
throw new JSONException("toJSON error", var11);
}
} else {
String text = toJSONString(javaObject);
return parse(text);
}
}
}
}
}
}
可以发现里面嵌套了4层if-else语句,逻辑十分复杂,甚至还有递归方法。
所以 parseObject() 方法的执行效率很低,如果出现高并发的情况,那很可能直接崩溃。
关于JSONObject的性能问题的更多相关文章
- json解析性能比较(gson与jackson) (zz)
现在json的第三方解析工作很多,如json-lib,gson,jackson,fastjson等等.在我们完成一般的json-object转换工作时,几乎都没有任何问题.但是当数据的量上来时,他们的 ...
- 【原创】大众点评监控平台cat的性能分析
由于工作的原因,或者说我们之前内部监控设计和实现有点不满足现有的研发需求,所以调研了一下大众点评开源出来的cat这一套监控系统. 今天我们就来实验一把,cat的客户端埋点在我们的程序流程中上报数据到c ...
- [转] FastJson---高性能JSON开发包
原文地址: FastJson---高性能JSON开发包 Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发.1.遵循http://json.org标准,为 ...
- 【Java/Android性能优2】Android性能调优工具TraceView介绍
本文参考:http://www.trinea.cn/android/android-traceview/ Android自带的TraceView堪比java的性能调优工具visualvm线程视图,可以 ...
- 【Android】以BaseAdapter做适配器的ListView及其性能优化
适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...
- Swift 性能探索和优化分析
本文首发在 CSDN<程序员>杂志,订阅地址 http://dingyue.programmer.com.cn/. Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程 ...
- Java 编程:如何提高性能?(简单总结篇)
开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作系 ...
- (转)FastJson---高性能JSON开发包
场景:javaBean对象转化为json对象! 1 Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发.1.遵循http://json.org标准,为其官 ...
- Java几种常用JSON库性能比较
本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...
随机推荐
- Python课程笔记(三)
1.python定义类.创建对象 class Myclass: # 定义Myclass类 def sum(self,x,y): self.x = x self.y = y return self.x+ ...
- RecyclerView使用详解
使用RecyclerView要引用对应的jar包,但最新版的项目中,不用引用也可以使用. implementation 'com.android.support:recyclerview-v7:27. ...
- 前端面试手写代码——模拟实现new运算符
目录 1 new 运算符简介 2 new 究竟干了什么事 3 模拟实现 new 运算符 4 补充 预备知识: 了解原型和原型链 了解this绑定 1 new 运算符简介 MDN文档:new 运算符创建 ...
- js 在浏览器中的event loop事件队列
目录 前言 认识一个栈两个队列 执行过程 异步任务怎么分配 简单例子 难一点的例子 前言 以下内容是js在浏览器中的事件队列执行,与在nodejs中有所区别,请注意. 都说js是单线程的,不过它本身其 ...
- 我的笔记本电脑瞬间扩大一个T的容量!
前言 不知道有多少人在家里搭建中央存储设备的,也就是NAS.这个东西在我日常生活中,存储了大量的个人资料,家人们的照片,技术的资料,还有各种高清影视剧.搭配公网的IP,可以真正做到,任何时候任何地点的 ...
- 使用jax加速Hamming Distance的计算
技术背景 一般认为Jax是谷歌为了取代TensorFlow而推出的一款全新的端到端可微的框架,但是Jax同时也集成了绝大部分的numpy函数,这就使得我们可以更加简便的从numpy的计算习惯中切换到G ...
- k8s入坑之路(10)kubernetes coredns详解
概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...
- IDEA中三种注释方式的快捷键
三种注释方式 行注释.块注释.方法或类说明注释. 一.快捷键:Ctrl + / 使用Ctrl+ /, 添加行注释,再次使用,去掉行注释 二.演示代码 if (hallSites != null ...
- GoLang设计模式15 - 策略模式
策略模式是一种行为型设计模式.通过策略模式,可以在运行时修改一个对象的行为. 接下来仍然是通过例子来了解策略模式.比如说内存缓存,这是我们在开发中经常使用的东西,大家应该都有一定的了解,接下来就用内存 ...
- 问题 K: 找点
题目描述 上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点.但是这几天LYH太忙了,你们帮帮他吗? 输入 多组测试数据. 每组数据先输入一个N,表示有N个闭区间(N ...