改進你的c#程式碼的5個技巧(四)
像每一篇文章一樣,我會重複幾行。我在我的Core i3 CPU、4GB主記憶體和Windows 7平臺上測試了以下程式碼。如果你在不同的硬體配置或使用不同的平臺,那麼你的輸出可能會隨著我的輸出螢幕而變化,並且輸出可能會根據當前執行的程序而變化。由於所有的點都是效能測試,我已經在釋出模式下對它們進行了測試,並在一個穩定的情況下對所有程式碼進行了截圖。讓我們從第一條建議開始。
如何檢查程式碼中的空字串?
在這一點上,我將向你展示三種空或空字串檢查樣式。我希望你熟悉所有的風格,但可能不熟悉他們的表現。讓我們從一個小例子開始。下面有三個函式(是的,都是靜態的)。我很懶,不想再次建立物件)。在第一種樣式中,我使用Length屬性。在第二種情況下,我使用一個空格或空字串(" ")。在第三種情況下,我使用string類的空屬性。下面是我的測試程式碼。
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace Test1 { public class Compare { public static void First(string Value) { if (Value.Length != 0) { } } public static void Second(string Value) { if (Value != "") { } } public static void Third(string Value) { if (Value != string.Empty ) { } } } class Program { static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); Compare.First("Sourav"); sw.Stop(); Console.WriteLine("Using Length: "+sw.ElapsedTicks); sw.Restart(); Compare.Second("Sourav"); sw.Stop(); Console.WriteLine("Using != " +sw.ElapsedTicks); sw.Restart(); Compare.Third("Sourav"); sw.Stop(); Console.WriteLine("Using Empty: " + sw.ElapsedTicks); Console.ReadLine(); } } }
輸出結果如下:
我們可以看到長度測量風格(第一種)花費的時間最多。字串空樣式是耗時最少的過程。
所以,最後一句是"使用String.Empty檢查字串是否為空”。
更改你的型別轉換風格
是的,如果你沒有實現正確的型別轉換技術,請更改它。下面我將展示兩種傳統的型別轉換風格及其對程式碼效能的影響。第一種風格(也是最糟糕的一種)非常簡單,使用大多數開發人員都使用的圓括號()。第二種風格是通過as關鍵字。在下面的程式碼中,我實現了這兩個功能。讓我們來看看下面的程式碼。
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace Test1 { public class Base { } public class Derive : Base { } class Program { static void Main(string[] args) { Derive d = new Derive(); Stopwatch sw = new Stopwatch(); sw.Start(); Base b =(Base) d; sw.Stop(); Console.WriteLine("Using type cust : "+ sw.ElapsedTicks); sw.Restart(); Base c = d as Base; sw.Stop(); Console.WriteLine("Using as keyword : "+ sw.ElapsedTicks); Console.ReadLine(); } } }
下面是輸出內容:
嗯. .我們流行的最差技術比as關鍵字慢6倍。現在,在這一點上,我不會寫結論,如何轉換物件是你的選擇。
高字串比較法
是的,關於字串的另一個技巧。我們知道有兩種常用的字串比較方法。一個是“操作符==”,另一個是使用String類的Equals()方法。
有一天我問我的一個同事:“你最喜歡哪一個?”他回答了第一個(換句話說,==)。我問他為什麼?他回答說:“它非常簡單,容易,從我第一次學習c#開始,我就一直在使用它,我對它很滿意,我不會改變我的風格。”嗯,如果你也處於這種情況,那麼我建議你先看看輸出螢幕,然後再看看程式碼。
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace Test1 { public class Test { public static void First(String Value) { for (int i = 0; i < 100; i++) { if (Value == "Sourav") { continue; } } } public static void Second(String Value) { for (int i = 0; i < 100; i++) { if (Value.Equals("Sourav")) { continue; } } } } class Program { static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); Test.First("Sourav"); sw.Stop(); Console.WriteLine("Using == : "+ sw.ElapsedTicks); sw.Restart(); Test.Second("Sourav"); sw.Stop(); Console.WriteLine("Using Equals : "+ sw.ElapsedTicks); Console.ReadLine(); } } }
你有一個附帶快速計算的計算器。螢幕顯示,使用"=="樣式比字串比較函式(Equals())慢190倍。我不會寫結論。這是你的責任,改變你的風格,並分享上面的影象(輸出螢幕)給你的朋友。
用一個小技巧刺穿迴圈
在開始之前,我想告訴你一件事。這不是很重要的一點。否則這將是一個非常重要的適應技巧。這裡,我將展示如何實現傳統的for迴圈。如果你遍歷下面的程式碼,那麼會發現在第二個“for”實現中,區域性變數使用的時間更少,這就是為什麼消耗的時間更少,但並不是非常少。因此,最好的做法是減少變數的使用次數。
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace Test1 { public class Base { public static void First(Int32 limit) { for (int i = 0; ++i <= limit; ) { } } public static void Second(Int32 limit) { for (int i = limit; -- i >= 0; ) { } } } class Program { static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); Base.First(100); sw.Stop(); Console.WriteLine("First "+ sw.ElapsedTicks); sw.Restart(); Base.Second(100); sw.Stop(); Console.WriteLine("Second : "+ sw.ElapsedTicks); Console.ReadLine(); } } }
下面是輸出內容:
讓我們寫一行結論:“在編寫迴圈迭代程式碼時要聰明。”
繼承是一種很好的實踐,但並不總是如此
我們知道OOP的一個漂亮特性是繼承,它減少了程式碼冗餘,改進了程式碼維護等等。我並不否認這些,但我的第五點是反對到處不必要地設立小類。如果真的不需要,那麼就不要建立類層次結構。看看下面的程式碼。
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace Test1 { public class Base { } public class Derive :Base { public string name; } public class Concrete { public string name; } class Program { static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); Derive d = new Derive(); d.name = "Sourav"; sw.Stop(); Console.WriteLine("Derive style : "+ sw.ElapsedTicks); sw.Restart(); Concrete c = new Concrete(); c.name = "Sourav"; sw.Stop(); Console.WriteLine("Concrete class : "+ sw.ElapsedTicks); Console.ReadLine(); } } }
首先,我建立了兩個小類,在它們之間我根本沒有使用第一個類。它作為基類服務。在第二個場景中,我建立了一個具體的類;它沒有繼承的概念。在main()方法中,我建立了它們的一個物件。讓我們看看輸出螢幕。
正如輸出螢幕所示,在具體類中建立物件要比在派生類中快得多。讓我們以一行註釋結束“如果不需要,不要實現類層次結構”。
結論
親愛的讀者,感謝你花費寶貴的時間完成這篇文章。(因為大多數讀者不會從頭讀到尾,如果你讀了,那是我的個人成就)。歡迎大家提出各種意見。
歡迎關注我的公眾號,如果你有喜歡的外文技術文章,可以通過公眾號留言推薦給我。
原文連結:https://www.c-sharpcorner.com/UploadFile/dacca2/5-tips-to-improve-performance-of-C-Sharp-code-par