c#基础系列之System.String的深入理解

2020-01-05 09:21:48丽君

一个程序集加载的时候,CLR默认会留用该程序集元数据中描述的所有文本常量字符串。由于可能会出现额外的哈希表查找造成的性能下降的现象,所以现在可以禁用这个特性了。

coding中我们平常比较两个字符串是否相等,那这个过程是怎么样的呢?

  • 首先判断字符的数量是否相等。
  • CLR逐个对比字符最终确定是否相等。

    这个场景是适合字符串留用的。因为不再需要经过以上的两个步骤,直接哈希表拿到value就可以对比确定了。

    关于字符串拼接性能

    基于以上所有知识,那是不是StringBuilder拼接字符串性能永远都高于符号‘+'呢?答案是否定的。

    
     static void Main(string[] args)
      {
       int count = 10000000;
       Stopwatch sw = new Stopwatch();
       sw.Start();   
       string str1 = "str1", str2 = "str2", str3 = "str3";
       for (int i = 0; i < count; i++)
       {
        string s = str1 + str2 + str3;
       }
       sw.Stop();
       Console.WriteLine($@"+用时: {sw.ElapsedMilliseconds}" );
    
       sw.Reset();
       sw.Start();
       for (int i = 0; i < count; i++)
       {
        StringBuilder sb = new StringBuilder();//听说程序员都这样命名StringBuilder
        sb.Append(str1).Append(str2).Append(str3);
       }
       sw.Stop();
       Console.WriteLine($@"StringBuilder.Append 用时: {sw.ElapsedMilliseconds}");
    
       Console.Read();
      }

    运行结果:

    +用时: 553