[C#][Tips]迴圈中別建立執行個體

  • 10516
  • 0
  • C#
  • 2009-12-18

[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");

 

第一次

image

第二次

image

第三次

image

第四次

image

第五次

image

測試五次平均花費時間

寫法一平均時間寫法二平均時間寫法三平均時間
5071.446.85113