日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2023/12/10 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据量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性能问题(大数据传给前台)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。