现有一段代码:

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的性能问题的更多相关文章

  1. json解析性能比较(gson与jackson) (zz)

    现在json的第三方解析工作很多,如json-lib,gson,jackson,fastjson等等.在我们完成一般的json-object转换工作时,几乎都没有任何问题.但是当数据的量上来时,他们的 ...

  2. 【原创】大众点评监控平台cat的性能分析

    由于工作的原因,或者说我们之前内部监控设计和实现有点不满足现有的研发需求,所以调研了一下大众点评开源出来的cat这一套监控系统. 今天我们就来实验一把,cat的客户端埋点在我们的程序流程中上报数据到c ...

  3. [转] FastJson---高性能JSON开发包

    原文地址: FastJson---高性能JSON开发包 Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发.1.遵循http://json.org标准,为 ...

  4. 【Java/Android性能优2】Android性能调优工具TraceView介绍

    本文参考:http://www.trinea.cn/android/android-traceview/ Android自带的TraceView堪比java的性能调优工具visualvm线程视图,可以 ...

  5. 【Android】以BaseAdapter做适配器的ListView及其性能优化

    适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...

  6. Swift 性能探索和优化分析

    本文首发在 CSDN<程序员>杂志,订阅地址 http://dingyue.programmer.com.cn/. Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程 ...

  7. Java 编程:如何提高性能?(简单总结篇)

    开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作系 ...

  8. (转)FastJson---高性能JSON开发包

    场景:javaBean对象转化为json对象! 1 Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发.1.遵循http://json.org标准,为其官 ...

  9. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...

随机推荐

  1. ST表 ----kzsn考挂后有感

    ST表,一个十分神奇的东西,需要O(nlogn)的时间预处理,但是他查询只需要O(1). 看似与线段树等数据结构时间复杂度一样,但是ST表的复杂度只在于预处理,预处理之后可以当做不耗时! 而想线段树这 ...

  2. UVA-1016 Silly Sort

    UVA-1016 题目大意:给定一个长度为n的序列,每次操作可以交换任意两个数的位置,代价为两个数的和,求最小代价,将序列排成有序的. 首先,显然需要交换的数一定会形成环: 那么对于每一个环,我们有两 ...

  3. 示波器分析I2C时序波形图

    对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置.今天,我们就随便聊聊这个I2C协议. I2C协议中最重要的一点是I2C地址.这个地址有7位和 ...

  4. 如何用PADS进行PCB设计?这6步就够了

    在使用PADS进行PCB设计的过程中,需要对印制板的设计流程以及相关的注意事项进行重点关注,这样才能更好的为工作组中的设计人员提供系统的设计规范,同时也方便设计人员之间进行相互的交流和检查. 02 设 ...

  5. 记一次,因表变量导致SQL执行效率变慢

    场景 最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟 JOB执行流程分析  首先,对于JO ...

  6. java+selenium+testNG+Allure报表【新增截图到报表功能】

    1.pom.xml配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://w ...

  7. (数据科学学习手札130)利用geopandas快捷绘制在线地图

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中,我为大家介绍了不久前发布的 ...

  8. css书写规范 & 页面布局规范 &常用案例经验总结

    CSS 属性书写顺序(重点) 建议遵循以下顺序: 布局定位属性:display / position / float / clear / visibility / overflow(建议 displa ...

  9. Java经典面试题-不古出品

    @ 目录 一.Java 基础 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? ...

  10. JVM 核心参数

    JVM 内存相关的几个核心参数 参数部分看我笔记   https://note.youdao.com/s/Ch3awnVu JVM模板 1. ParNew + CMS 版 根据服务调整 -Xmx -X ...