優化C#代碼性能的5個小竅門 1、你是否用異常機制來處理過用戶輸入驗證? 如果是,那麼你的程序性能已經降低了62倍。你不相信嗎?等幾分鐘,我將會告訴你怎麼回事。但是在示例之前,我們先了解清楚哪裡進行異常是真正必要的。 舉個例子,你驗證用戶輸入的數據,如果無效,則拋出異常到客戶端(我假定你是基於業務邏輯校驗用戶輸入的)。 [csharp] class BusinessLogcCheck { public void Check() { try { //Your validation code is here } catch (Exception ex) { throw new Exception("My own exception"); } } } 親愛的朋友,在接下來的例子中,當你看到了屏幕輸出的結果後,你將會認識到那是多麼糟糕的習慣。讓我們來看下面的代碼。 [csharp] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; using System.Net; using System.Net.NetworkInformation; namespace Test1 { class Program { public static void ThrowTest() { throw new Exception("This is exceptopn"); } public static Boolean Return() { return false; } static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); try { ThrowTest(); } catch { } sw.Stop(); Console.WriteLine("With Exception " + sw.ElapsedTicks); sw.Restart(); try { Return(); } catch { } sw.Stop(); Console.WriteLine("With Return " + sw.ElapsedTicks); Console.ReadLine(); } } } 這是你正在等待的輸入結果。 我的證明非常簡單。在一個函數中引發一個異常,而在另一個函數中返回用戶輸入校驗後的布爾值。而且我附加了一個計算器讓你相信異常處理是如何影響代碼性能的。 所以我們可以得出一個結果:不要針對用戶輸入驗證拋出一個異常,而使用布爾值來返回驗證輸入的業務邏輯(或者其他相似的技術)。因為異常對象代價太高了。(不過也高不過你所鐘愛的襯衣。哈哈) 2.絕對不要在循環中使用try-Catch. 是的,這也是和異常處理相關的。我再重復一遍:絕對不要在循環中使用try-Catch。讓我用一個例子來證明。 [csharp] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; using System.Net; using System.Net.NetworkInformation; namespace Test1 { class Program { static void Method1() { for (int i = 0; i < 1000; i++) { try { int value = i * 100; if (value == -1) { throw new Exception(); } } catch { } } } static void Method2() { try { for (int i = 0; i < 1000; i++) { int value = i * 100; if (value == -1) { throw new Exception(); } } } catch { } } static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); Method1(); sw.Stop(); Console.WriteLine("Within Loop " + sw.ElapsedTicks); sw.Restart(); Method2(); sw.Stop(); Console.WriteLine("Outside of Loop " + sw.ElapsedTicks); Console.ReadLine(); } } }