C# 語言性能提升方法

1、String Split

在C#中,共有10個Split 的重載方法
在這裏插入圖片描述
大多數開發人員使用如下方法:

static void SplitChar()
{
     var str = "Akshay|Patel";
     var s1 = new Stopwatch();
     s1.Start();
     string[] temp = str.Split('|');
      Console.WriteLine($"SplitChar ElapsedTicks:{s1.ElapsedTicks.ToString()}");
}

讓我們改變一下,也就是說不直接傳遞字符,而是我們創建一個字符數組並將它們作爲參數傳遞到Split方法

static void SplitCharArray()
{
    var str = "Akshay|Patel";
    var s2 = new Stopwatch();
    s2.Start();
    string[] temp =  str.Split(new char[]{'|'});
    Console.WriteLine($"SplitCharArray ElapsedTicks:{s2.ElapsedTicks.ToString()}");
}

運行程序並比較一下執行時間
在這裏插入圖片描述
結果表明使用第二種方法效率更高,更節省時間。

2、String Equals

在下面的代碼中,我們檢查str變量的值是否等於字符串“Akshay”。而且,不知道是什麼原因,str的值爲null。

static void Equals1()
{
    try
    {
        string str = null;
        Console.WriteLine(str.Equals("Akshay") ? "IF" : "ELSE");
    }
    catch (Exception ex)
    {
         Console.WriteLine(ex.Message);
    }
}

執行上面的代碼,str.Equals 將會拋出一個空引用異常。
在這裏插入圖片描述
現在我們換一種方式思考,不使用str的Equals方法,而是使用“Akshay”的Equals方法

static void Equals2()
{
    try
    {
        string str = null;
        Console.WriteLine("Akshay".Equals(str) ? "IF" : "ELSE");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
     }
}

在這個情況下,代碼正確的執行,而不是拋出空指針異常
在這裏插入圖片描述

3、Adding Strings

在這裏,我們對字符串插值(string interpolation),字符串格式化(string format),字符串連接(string concat)和字符串構建器(striing builder)進行基準測試

static void AddStrings()
{
    string str = "Akshay";
    string str1 = " Petal";
    string result = string.Empty;
    var s1 = new Stopwatch();

    //String Interploation
    s1.Start();
    result = $"{str} {str1} is an author";
    Console.WriteLine($"String Interpolation {s1.ElapsedTicks.ToString()}");

    //String Format
    s1.Restart();
    result = string.Format("{0},{1} is an author", str, str1);
    Console.WriteLine($"String Format {s1.ElapsedTicks.ToString()}");

    //String Concat
    s1.Restart();
    result = string.Concat(str, str1, " is an auther");
    Console.WriteLine($"String Concat {s1.ElapsedTicks.ToString()}");

    //StringBuilder
    s1.Restart();
    StringBuilder sb = new StringBuilder();
    sb.Append(str);
    sb.Append(str1);
    sb.Append(" is an auther");
    result = sb.ToString();
    Console.WriteLine($"StringBuilder {s1.ElapsedTicks.ToString()}");
}

通過採用四種不同的方法來添加兩個字符串拼接起來,看一下基準測試結果。每次運行結果可能不同,有些差距還比較大,但是這四種方法中都是string Concat用時最少。
在這裏插入圖片描述
基準測試結果表明,建議使用string Concat方法進行字符串的拼接。

4、List.Count() Vs List.Any()

5、List.Count() Vs List.Count

很多時候,開發人員在迭代之前,使用List.Count()方法來檢查lib是否有數據或者是否爲空。在這裏比較List.Count()和List.Any()方法的執行時間。

static void ListCountAndAny()
{
    var watch = new Stopwatch();
     var strs = new List<string>()
     {
          "Akshay",
          "Patel",
          "Panth",
          "Patel"
     };
    watch.Start();
    if (strs.Count() > 0) { }
    Console.WriteLine($"List.Count() {watch.Elapsed}");

    watch.Restart();
    if (strs.Any()) { }
    Console.WriteLine($"List.Any() {watch.Elapsed}");

    watch.Restart();
    if (strs.Count > 0) { }
    Console.WriteLine($"List.Count {watch.Elapsed}");
}

在這裏插入圖片描述
通過執行時間來看,Count()方法比Any()方法節省時間。但是直接使用Count屬性耗時更少。
這裏與原作者給出的執行時間有出入,需要讀者自行鑑別選用方法。

6、Array Length

通常,開發人員傾向於在for循環中使用Array.Length作爲迭代的條件,但需要我們知道的是,每次迭代都會調用Length屬性。最好將其存儲在變量中並將該變量作爲迭代條件

Array.Length in the loop

static void ArrayLengthInLoop()
{
    var  watch = new Stopwatch();
    string[] names = new[] {"Akshay", "Patel", "Panth"};
    watch.Start();
    for (int i = 0; i < names.Length; i++)
    {
                
    }
   Console.WriteLine($"Array.Length in the Loop: {watch.Elapsed}");
}

Array.Length in a Variable

static void ArrayLengthInVariable()
{
    var watch = new Stopwatch();
    string[] names = new[] { "Akshay", "Patel", "Panth" };
    watch.Start();
    int k = names.Length;
    for (int i = 0; i < k; i++)
    {

    }
   Console.WriteLine($"Array.Length in a Variable: {watch.Elapsed}");
}

基準測試結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章