C#简单性能提升

C#简单性能提升

  • 1、String Split()
  • 2、String Equals()
  • 3、Adding Strings()
  • 4、List.Count() Vs List.Any() Vs List.Count
  • 5、Array Length

1、String Split()

  • 在C#中,共有10个Split()的重载方法

C#简单性能提升_第1张图片

  • 一般用法
static void SplitChar()
{
     
    var str = "Hello|World";
    // 实例化秒表对象
    var s1 = new Stopwatch();
    s1.Start();
    _ = str.Split('|');
    Console.WriteLine($"SplitChar ElapsedTicks:{s1.ElapsedTicks}");
}
  • 优化写法创建一个字符数组并将它们作为参数传递到Split()方法
static void SplitCharArray()
{
     
    var str = "Hello|World";
    // 实例化秒表对象
    var s1 = new Stopwatch();
    s1.Start();
    _ = str.Split(new char[] {
      '|' });
    Console.WriteLine($"SplitCharArray ElapsedTicks:{s1.ElapsedTicks}");
}

测试结果,显而易见,使用字符数组的方式效率要高很多
C#简单性能提升_第2张图片

2、String Equals()

  • 检查str变量的值是否等于字符串“Akshay”,而且,不知道是什么原因,str的值为null
static void Equals1()
{
     
    try
    {
     
        string str = null;
        Console.WriteLine(str.Equals("Hello World") ? "IF" : "ELSE");
    }
    catch (Exception ex)
    {
     
        Console.WriteLine(ex.Message);
    }

}

上述写法,我们的程序抛出了一个空引用异常
C#简单性能提升_第3张图片

  • 不使用strEquals()方法,而是使用“Akshay”Equals()方法
static void Equals2()
{
     
    try
    {
     
        string str = null;
        Console.WriteLine("Hello World".Equals(str) ? "IF" : "ELSE");
    }
    catch (Exception ex)
    {
     
        Console.WriteLine(ex.Message);
    }
}

换了思路后,我们的程序输出了我们定义的结果
C#简单性能提升_第4张图片

3、Adding Strings()

  • 对字符串插值(string interpolation),字符串格式化(string format),字符串连接(string concat)和字符串构建器(striing builder)进行基准测试
static void AddStrings()
{
     
    string str = "Hello";
    string str1 = "World";
    var s1 = new Stopwatch();

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

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

    //String Concat
    s1.Restart();
    _ = string.Concat(str, str1, " is an auther");

    Console.WriteLine($"String Concat {s1.ElapsedTicks}");

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

四种不同的方法来添加两个字符串拼接起来,四种方法中string.Concat()用时最少
根据测试结果建议使用 string.Concat() 方法进行字符串的拼接
C#简单性能提升_第5张图片

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

  • 在迭代之前,使用List.Count()方法来检查lib是否有数据或者是否为空。在这里比较List.Count()List.Any()方法的执行时间
static void ListCountAndAny()
{
     
    var watch = new Stopwatch();
    var strs = new List<string>()
    {
     
        "Hello",
        "World",
        "CSahrp",
        "Years"
    };

    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属性耗时更少
C#简单性能提升_第6张图片

5、Array Length

  • 开发人员倾向于在for循环中使用Array.Length作为迭代的条件,但需要我们知道的是,每次迭代都会调用Length属性。最好将其存储在变量中并将该变量作为迭代条件

数组长度直接作为迭代条件

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

数组长度,存储在变量中,将该变量作为迭代条件

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

节省了除第一次以外,获取数组长度的时间,提升了一定的效率
C#简单性能提升_第7张图片
测试结果存在一定误差,参考便好

你可能感兴趣的:(C#,c#,优化,算法)