[C#][Tips]迴圈中別建立執行個體
今天處理一個小問題,朋友詢問如何加快開啟程式時間
當下很直覺的回答:別再Form_Load處理太複雜或耗時作業
但後來看code發現Form_Load邏輯雖然不會很複雜
但因為在迴圈中包了try catch和建立執行個體(多CPU也不是這樣操的XD)
導致再開啟應用程式特別緩慢,這裡簡單測試該狀況。
行為:執行50萬次後取得結果。
寫法一:迴圈中包含try catch和建立執行個體
Int32 myvalue = 0;
Stopwatch sw = new Stopwatch();
sw.Reset();
sw.Start();
for (Int32 i = 0; i < 500000; i++)
{
try
{
Random rnd = new Random();//建立執行個體
myvalue = rnd.Next(1,999);
//if.... throw new Exception
}
catch(Exception ex)
{
}
}
sw.Stop();
Console.Write(myvalue + " 寫法一花費時間:" + sw.ElapsedMilliseconds.ToString() + "\r\n");
寫法二:將try catch和建立執行個體拉到迴圈外
Random rnd1 = new Random();//建立執行個體
myvalue = 0;
sw.Reset();
sw.Start();
try
{
for (Int32 i = 0; i < 500000; i++)
{
myvalue = rnd1.Next(1, 999);
//if.... throw new Exception
}
sw.Stop();
}
catch (Exception ex)
{
}
Console.Write(myvalue + " 寫法二花費時間:" + sw.ElapsedMilliseconds.ToString() + "\r\n");
寫法三:和寫法一差不多,只差先將物件拉出迴圈外並宣告null
Random rnd2=null;//宣告null
myvalue = 0;
sw.Reset();
sw.Start();
for (Int32 i = 0; i < 500000; i++)
{
try
{
rnd2 = new Random();//建立執行個體
myvalue = rnd2.Next(1, 999);
//if.... throw new Exception
}
catch (Exception ex)
{
}
}
sw.Stop();
Console.Write(myvalue + " 寫法三花費時間:" + sw.ElapsedMilliseconds.ToString() + "\r\n");
第一次
第二次
第三次
第四次
第五次
測試五次平均花費時間
寫法一平均時間 | 寫法二平均時間 | 寫法三平均時間 |
5071.4 | 46.8 | 5113 |