1. 程式人生 > >大資料量JSONObject.fromObject效能問題(大資料傳給前臺)

大資料量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!