大数据量JSONObject.fromObject性能问题(大数据传给前台)

最近项目中我负责了一个jms打印log信息的功能模块。大体需求是,用jms接受log信息,然后前台请求的时候,发给前台最新的log信息,前台会不断的刷新获取数据。
个人思路是写一个静态的固定长度的list保存log信息,如果list满了清空。前台第一次访问的时候,返回给前台当前的index,下次再访问的时候,返回从index开始,到list长度的数据,这样返回信息量可能是整个list。list我设置的长度是1000。
按思路来弄,结果没啥偏差,可我偶尔发现后台请求处理有点过慢,能明显感到请求的停顿。
之前代码是这么写的
Map dto=sv.searchLog(province_code, index);
        json= JSONObject.fromObject(dto);

dto的信息
dto.put("rows", searchData);
dto.put("index", new_index);
dto.put("size", searchData.size());

代码这么看上去没啥问题,很正常,很健康!但问题就出在这里!
我之前怀疑过会是jms的问题,但jms向list中写入数据的时候是单独线程异步写入的,跟这个日志查询没关系!
接着我去看查询的代码:
Map dto=new HashMap();
List searchData=new ArrayList();
List rows=LOG_ROWS.get(province_code);
if(rows==null){
rows=new ArrayList();
}
searchData.addAll(rows);
int new_index=searchData.size();
int _index=Integer.parseInt(index);
if(_index==-1){//如果是第一次请求 返回当前index
dto.put("rows", new ArrayList());
dto.put("index", new_index);
dto.put("size", 0);
return dto;
}
//如果保存的日志清空过并且总长度小于要查询的下标 
if(_index>searchData.size()){
_index=0;
}
//删除原有的数据
for(int i=_index-1;i>-1;i--){
searchData.remove(i);
}
dto.put("rows", searchData);
dto.put("index", new_index);
dto.put("size", searchData.size());
return dto;
searchData.addAll(rows); 这段代码可能会有人有疑问,这是为了防止jms刷新list信息的时候干扰到传送给前台的数据。我也怀疑过是这里addAll的性能问题,测试下毫无问题!
没结果呀,继续去找原因,我又瞄上了searchData.remove(i);,这里是循环删除,我判断了下又没有问题!怎么办!
最后我找到了JSONObject!问题果真出在这里,1k条数据,新增到list中和JSONObject.fromObject消耗的时间几乎是一样的!问题终于找到了也好解决了,下边贴出代码大家测试看下:
List rows=new ArrayList();
List data=new ArrayList();
Date begin=new Date();
for(int i=0;i<1000;i++){
//这里我为了省事用的md5加密时间 模拟大字符串
rows.add(MD5ENcode.encode(new Date().toString())
+MD5ENcode.encode(new Date().toString())+MD5ENcode.encode(new Date().toString())
+MD5ENcode.encode(new Date().toString())+MD5ENcode.encode(new Date().toString())
);
}
System.out.println("add时间:"+(new Date().getTime()-begin.getTime()));
begin=new Date();
data.addAll(rows);
System.out.println("addall时间:"+(new Date().getTime()-begin.getTime()));
begin=new Date();
for(int i=999;i>-1;i--){
rows.remove(i);
}
System.out.println("del时间:"+(new Date().getTime()-begin.getTime()));
begin=new Date();
Map dto=new HashMap();
dto.put("rows", rows);
dto.put("index", rows.size());
dto.put("size", rows.size());
JSONObject json= JSONObject.fromObject(dto);
System.out.println("json时间:"+(new Date().getTime()-begin.getTime()));
begin=new Date();
JSONObject json2 = new JSONObject();
json2.put("rows", dto.get("rows"));
json2.put("index", dto.get("index"));
json2.put("size", dto.get("size"));
System.out.println("jsonput时间:"+(new Date().getTime()-begin.getTime()));

本能结果如下
add时间:333
addall时间:0
del时间:1
json时间:354
jsonput时间:0

好了以上信息供大家参考,继续努力去学java!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JSONObject.fromObjectJSONObject.parseObject都是用于将 JSON 字符串转换为 Java 对象的方法。但它们所属的类库不同。 1. JSONObject.fromObject:这个方法是来自于 Java 的 JSON-lib 库。它可以将 JSON 字符串转换为一个 JSONObject 对象,该对象可以方便地操作 JSON 数据。例如,你可以通过该对象获取特定的属性值、修改属性值、添加新的属性等。 示例代码: ``` import net.sf.json.JSONObject; // ... String jsonString = "{\"name\":\"John\", \"age\":30}"; JSONObject jsonObject = JSONObject.fromObject(jsonString); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); System.out.println("Name: " + name); System.out.println("Age: " + age); ``` 2. JSONObject.parseObject:这个方法来自于阿里巴巴的 fastjson 库。它可以将 JSON 字符串转换为一个 Java 对象,该对象可以直接与 Java 类型进行交互。使用 parseObject 方法时,你需要指定目标对象的类型。 示例代码: ``` import com.alibaba.fastjson.JSON; // ... String jsonString = "{\"name\":\"John\", \"age\":30}"; Person person = JSON.parseObject(jsonString, Person.class); String name = person.getName(); int age = person.getAge(); System.out.println("Name: " + name); System.out.println("Age: " + age); ``` 需要注意的是,如果你使用的是 fastjson 库,你需要在项目中添加 fastjson 的依赖。对于 JSON-lib 库,你需要添加 json-lib 的依赖。 这两种方法在处理 JSON 字符串时都提供了很大的灵活性和便利性,你可以根据自己的需求选择其中之一来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值