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

碼農譯站發表於2021-01-19

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

相關文章