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}");
}

基准测试结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值