關於優化for迴圈的注意的事項

2022-01-20 12:54:35 字數 4420 閱讀 8061

for迴圈注意事項:

1.for迴圈內部盡量少做資料庫查詢之類的io代價大的操作

2.盡量控制for迴圈的次數,不多做無用功

3.能一次載入在記憶體中的,就不要通過迴圈來多次查詢資料庫,除非資料量過大。

4.for迴圈內部盡可能少建立物件,會耗費大量記憶體資源

起因:前兩天優化乙個統計功能的頁面,客戶反映說,點選頁面的查詢按鈕要等快十秒中資料才載入出來,然後點選匯出按鈕後,載入時間快翻一倍了。讓我查一下看看能不能優化。

仔細看了一下**,才發現**問題太大了。

發現問題:

描述一下優化前大致結構:

1.從相關主表中獲取所有工單資訊,儲存到dataset,然後通過for迴圈讀取資料到乙個工單物件的list中。

2.獲取用來修理工單所用的材料資訊,放在乙個dataset中,然後外迴圈dataset,內迴圈工單物件list。根據關聯id值相等來判斷,把相關材料資訊賦值給工單物件的材料資訊屬性。

3.for迴圈工單物件的list來生成拼接統計html,迴圈中放了乙個查詢sql,生成乙個dataset,用dataset中第一行第一列的值來和工單物件的乙個屬性來做比較,然後生成不同內容

4.在for迴圈結束處放了乙個判斷,如果小於200行,那就繼續新增拼接的html。

/// /// 查詢所有符合條件的工單物件

///

///

protected arraylist searchrecord()}}

catch (exception ex)

finally

sql = "select t1.id,t2.xlhycl from tz_main t1,v_tz_xiaowxiuanddaxiu_cailiao t2, tz_main_clinfo tz where t1.id=tz.main_id(+) and t1.id=t2.mainid and t1.reporttype in ('套室表','水管裝置','水管問題') and tz.executivepeople!=' ' and tz.executivepeople is not null and acceptstation in (" + session["depname"].tostring() + ") ";

//相關過濾判斷條件已刪除

sql += " order by t1.accepttime asc ";

ds = odb.getdataset(sql);

if (ds != null && ds.tables.count > 0 && ds.tables[0].rows.count > 0)

else}}

}}

}return xlgctjarr;

}/// /// 通過xlgctjarr 拼接html

///

/// 0,表示查詢,只用顯示200條資料即可,1表示匯出功能,匯出所有資料

/// 工單物件列表

///

protected string showtable(string isall, arraylist xlgctjarr)

else

html += "";

html += "" + (s + 1) + "";

if (((xlgctjbean)xlgctjarr[i]).reporttype != null && ((xlgctjbean)xlgctjarr[i]).reporttype != "")

else

//統計型別

oracledatabase odb1 = new oracledatabase();

string sql = string.format(@"select * from statisticaltyep");

dataset dtstatisticaltype = odb1.getdataset(sql);

if (dtstatisticaltype != null && dtstatisticaltype.tables.count > 0)

else if (dtstatisticaltype.tables[0].rows[0]["type"].tostring() == "開工日期")

else if (dtstatisticaltype.tables[0].rows[0]["type"].tostring() == "修復日期")

}else

html += "";

if (isall == "")

}htmlstr += html;

htmlexportstr += html;//用於匯出儲存

}htmlstr += "";

htmlexportstr += "";

return htmlstr;

}

優化後:

由於時間緊,差不多修改優化了一下,等有時間的時候把業務了解清楚,準備再次進行優化。貼上優化後部分**

/// /// 查詢所有符合條件的工單物件

///

///

protected arraylist searchrecord()}}

catch (exception ex)

finally

sql = "select t1.id,t2.xlhycl from tz_main t1,v_tz_xiaowxiuanddaxiu_cailiao t2 ,tz_main_clinfo tz where t1.id=tz.main_id(+) and t1.id=t2.mainid and t1.reporttype in ('套室表','水管裝置','水管問題') and tz.executivepeople is not null and acceptstation in (" + session["depname"].tostring() + ") ";

sql += " order by t1.accepttime asc ";

ds = odb.getdataset(sql);

if (ds != null && ds.tables.count > 0 && ds.tables[0].rows.count > 0)

else}}

}}

}session.add("xlgctjarr", xlgctjarr);

return xlgctjarr;

}/// /// 通過xlgctjarr 拼接html

///

/// 0,表示查詢,只用顯示200條資料即可,1表示匯出功能,匯出所有資料

/// 工單物件列表

///

protected string showtable(string isall, arraylist xlgctjarr)

else

}for (int i = 0; i < allcount; i++, s++)

html += "" + (s + 1) + "";

if (((xlgctjbean)xlgctjarr[i]).reporttype != null && ((xlgctjbean)xlgctjarr[i]).reporttype != "")

else

//統計型別

if (dtstatisticaltype.rows.count > 0)

else if (dtstatisticaltyperesult == "開工日期")

else if (dtstatisticaltyperesult == "修復日期")

}else

html += "";

//if (isall == "")

////}

htmlstr += html;

htmlexportstr += html;//用於匯出儲存

}htmlstr += "";

htmlexportstr += "";

//}return htmlstr;

}

本次主要優化地方:

1.for迴圈工單物件的list來生成拼接統計html,迴圈中放了乙個查詢sql,生成乙個dataset,用dataset中第一行第一列的值來和工單物件的乙個屬性來做比較,然後生成不同內容.*****==>資料庫io代價太大,在for迴圈內做資料庫讀取操作的話,最好能放在for迴圈外面,多花一點記憶體比每次讀取資料庫的開銷小很多

2.在for迴圈結束處放了乙個判斷,如果小於200行,那就繼續新增拼接的html。*****》直接判斷好數量,盡量少做迴圈。

3.關於匯出的優化,由於業務規則是先查詢然後匯出。所以我把查詢時封裝的工單物件列表和生成的html字串都儲存在session中,等匯出的時候。判斷工單物件列表count小於等於200的話,直接把session中的html匯出就好。如果大於200,把超過200的list呼叫生成html的方法showtable()直接生成剩下的html,然後和session中的html拼接後匯出即可

注:下週有時間的話,去了解一下關於這個統計的業務,如果可能的話,把生成工單物件列表的三個for迴圈優化的只剩乙個,這樣效能才能翻翻!

關於SQL效能優化及注意事項

possible keys 表示查詢時,可能使用的索引 key 表示實際使用的索引 key len 索引欄位的長度,在組合索引中判斷索引被使用的情況尤為重要 ref 列與索引的比較 rows 掃瞄出的行數 filtered 按表條件過濾的行百分比 extra 執 況的描述與說明 關於索引的劃分 雜湊...

關於xp cmdshell的注意事項

一 mssql2000的master本身沒有擴充套件儲存過程xp cmdshell,所以要建立一下,然後就看直接使用了 sqlcommand.commandtext use master if not exists select from dbo.sysobjects where id object...

關於Textarea的注意事項

為什麼要特別提textarea?因為其實textarea這個節點很特殊。而因為這個節點特殊,所以在ie和其它瀏覽器下,對它的解釋不一樣。賣一下關子,哈哈!其實主要原因是今天幫乙個師兄修乙個bug,具體是因為從伺服器拉資料下來插進textarea的時候失敗,這個情況只在ie出現。其它瀏覽器一切正常!首...