改進你的c#代碼的5個技巧(四)

像每一篇文章同樣,我會重複幾行。我在個人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/

相關文章
相關標籤/搜索