1. 程式人生 > >改進你的c#程式碼的5個技巧(二)

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

在本文中,我將向你展示c#程式設計的5個最佳實踐。我從日常程式設計經驗中學到了這些實踐。我在release模式下測試了所有的程式碼,並在開發環境穩定後進行了截圖。我想你會喜歡這些建議的。

在使用資料型別之前選擇它

對於許多型別,我們寧願不決定在日常程式設計生活中使用什麼資料型別。就在幾個月前,我也是其中之一。但是當我開始學習程式設計中的最佳實踐以提高程式碼效能時,我瞭解到了錯誤的資料型別是如何影響程式碼的。我將展示一個演示來證明這個概念。

static void Main(string[] args)  
{  
    List<Int32> li = new List<int>();  
    Stopwatch sw =new Stopwatch();  
    sw.Start();  
    for (int i = 0; i < 10000; i++)  
    {  
        li.Add(i);  
    }  
    sw.Stop();  
    Console.Write("Using Arraylist(Object)" + sw.ElapsedTicks + "\n");  
    sw.Reset();  
    sw.Start();  
    Int32[] a = new Int32[10000];  
    for (int i = 0; i < 10000; i++)  
    {  
        a[i] = i;  
    }  
    sw.Stop();  
    Console.Write("Using Value(Integer Array)" + sw.ElapsedTicks);  
    Console.ReadLine();  
}  

在上面的程式碼中,首先我使用了一個list來儲存1000個整數值,在第二次執行相同的操作時,我使用了一個整數陣列。我的輸出截圖顯示了哪種儲存機制最適合整數陣列。現在,你可能會想為什麼這個list要花更多的時間呢?原因是,list以物件格式儲存資料,當我們首先嚐試儲存值型別時,它將其轉換為引用型別,然後再儲存。因此,第一點是始終選擇適當的儲存機制以獲得最佳效能。

使用for迴圈代替foreach

我現在要解釋一個非常有趣的事實。我想你們都熟悉for和foreach迴圈。現在如果我問你哪個更快?嗯…不知道。對吧?

夥計們,for迴圈比foreach迴圈快得多。讓我們看看下面的例子。

List<Int32> Count = new List<int>();
List<Int32> lst1 = new List<Int32>();
List<Int32> lst2 = new List<Int32>();

for (int i = 0; i < 10000; i++)
{
    Count.Add(i);
}

Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Count.Count; i++)
{
    lst1.Add(i);
}
sw.Stop();

Console.Write("For Loop :- " + sw.ElapsedTicks + "\n");
sw.Restart();

foreach (int a in Count)
{
    lst2.Add(a);
}
sw.Stop();
Console.Write("Foreach Loop:- " + sw.ElapsedTicks);
Console.ReadLine();

不要擔心,我已經在釋出模式下測試了這個示例,這個螢幕截圖是在幾次測試執行後拍攝的。

選擇何時使用類,何時使用結構體

接受這樣一個事實,即基本理解了c#中的結構體和類,或者至少理解了最喜歡的程式語言中的結構體和類(如果它們存在的話)。好吧,如果你在想“很久以前我學過結構體,但在日常編碼生活中從未使用過它”,那麼你就是那95%從未測量過類和結構體效能的開發人員中的一員。別擔心;在寫這篇文章之前,我也沒有。

那麼類呢?是的,我們時不時地在日常專案開發中實現一個類。

現在我的問題是“哪個更快,類還是結構體”?我猜你會想“從未測試過”。好的,我們來測試一下。看看下面的程式碼。

namespace BlogProject
{
    struct MyStructure
    {
        public string Name;
        public string Surname;
    }
    class MyClass
    {
        public string Name;
        public string Surname;
    }
    class Program
    {
        static void Main(string[] args)
        {

            MyStructure[] objStruct = new MyStructure[1000];
            MyClass[] objClass = new MyClass[1000];


            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 1000; i++)
            {
                objStruct[i] = newMyStructure();
                objStruct[i].Name = "Sourav";
                objStruct[i].Surname = "Kayal";
            }
            sw.Stop();
            Console.WriteLine("For Structure:- " + sw.ElapsedTicks);
            sw.Restart();

            for (int i = 0; i < 1000; i++)
            {
                objClass[i] = newMyClass();
                objClass[i].Name = "Sourav";
                objClass[i].Surname = "Kayal";
            }
            sw.Stop();
            Console.WriteLine("For Class:- " + sw.ElapsedTicks);

            Console.ReadLine();
        }
    }
}

輸出結果如下:

現在很明顯,結構體要比類快得多。同樣,我在釋出模式下測試了這段程式碼,並獲得了至少20個輸出,以使程式達到穩定的位置。

現在最大的問題是“為什麼結構體比類快?”

正如我們所知,結構體變數是值型別,值(或結構體變數)儲存在一個位置。

類物件是引用型別。如果是物件型別,則建立引用,並將值儲存在記憶體的其他位置。基本上,值儲存在一個可管理的堆中,指標建立在堆疊中。以這種方式在記憶體中實現一個物件,通常要比結構體變數花費更多的時間。

始終使用Stringbuilder進行字串連線操作

這一點對開發人員來說非常關鍵。在進行大量字串拼接操作時,請使用StringBuilder代替String。為了演示它對程式碼效能的影響,我準備了以下示例程式碼。我在for迴圈中執行了500次字串拼接操作。

public classTest
{
    public static string Name { get; set; }
    public static string surname;  
}  
class Program
{
    static void Main(string[] args)
    {
        string First = "A";
        StringBuilder sb = new StringBuilder("A");

        Stopwatch st = new Stopwatch();
        st.Start();
        for (int i = 0; i < 500; i++)
        {
            First = First + "A";
        }
        st.Stop();
        Console.WriteLine("Using String :-" + st.ElapsedTicks);
        st.Restart();

        for (int i = 0; i < 500; i++)
        {
            sb.Append("A");
        }
        st.Stop();
        Console.WriteLine("Using Stringbuilder :-" + st.ElapsedTicks);
        Console.ReadLine();
    }
}
這是輸出:

選擇分配類資料成員的最佳方式

在為類變數賦值之前,我建議你現在檢視以下程式碼和輸出螢幕。

namespace Test
{  
    public class Test  
    {  
        public staticstring Name { get; set; }
        public staticString surname;
    }
    class Program
    {
        static void Main(string[] args)
        {

            Stopwatch st = new Stopwatch();
            st.Start();
            for (int i = 0; i < 100; i++)
            {
                Test.Name = "Value";
            }
            st.Stop();
            Console.WriteLine("Using Property: " + st.ElapsedTicks);
            st.Restart();
            for (int i = 0; i < 100; i++)
            {
                Test.surname = "Value";
            }
            st.Stop();
            Console.WriteLine("Direct Assign: " + st.ElapsedTicks);
            Console.ReadLine();
        }
    }  
}  

 是的,我們的輸出螢幕是說,使用屬性分配資料成員比直接分配要慢得多。

 歡迎關注我的公眾號,如果你有喜歡的外文技術文章,可以通過公眾號留言推薦給我。

原文連結:https://www.c-sharpcorner.com/UploadFile/dacca2/5-tips-to-improve-performance-of-C-Sharp-c