像每一篇文章同樣,我會重複幾行。我在個人Core i3 CPU、4GB主內存和Windows 7平臺上測試瞭如下代碼。若是你在不一樣的硬件配置或使用不一樣的平臺,那麼你的輸出可能會隨着個人輸出屏幕而變化,而且輸出可能會根據當前運行的進程而變化。因爲全部的點都是性能測試,我已經在發佈模式下對它們進行了測試,並在一個穩定的狀況下對全部代碼進行了截圖。讓咱們從第一條建議開始。c#
如何檢查代碼中的空字符串?函數
在這一點上,我將向你展現三種空或空字符串檢查樣式。我但願你熟悉全部的風格,但可能不熟悉他們的表現。讓咱們從一個小例子開始。下面有三個函數(是的,都是靜態的)。我很懶,不想再次建立對象)。在第一種樣式中,我使用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檢查字符串是否爲空」。spa
更改你的類型轉換風格pwa
是的,若是你沒有實現正確的類型轉換技術,請更改它。下面我將展現兩種傳統的類型轉換風格及其對代碼性能的影響。第一種風格(也是最糟糕的一種)很是簡單,使用大多數開發人員都使用的圓括號()。第二種風格是經過as關鍵字。在下面的代碼中,我實現了這兩個功能。讓咱們來看看下面的代碼。code
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(); } } }
下面是輸出內容:orm
嗯. .咱們流行的最差技術比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-part-3/