最近项目中我负责了一个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!
大数据量JSONObject.fromObject性能问题(大数据传给前台)
最新推荐文章于 2024-09-18 15:30:29 发布