javascript
大数据量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!
總結
以上是生活随笔為你收集整理的大数据量JSONObject.fromObject性能问题(大数据传给前台)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Zhuan]Lua about
- 下一篇: The Ransom of Red Ch