• C#字符处理的性能问题


    1、"+"拼接

    +拼接会每次会导致新创建一个字符串,消耗内存。多个(10个以内)固定的字符连接可以使用"+"进行连接。编译器会做相应的优化会依据加号次数调用不同参数个数的 String.Concat 方法。

    例:string str = str1 + str2 + str3 + str4;

     会被编译为 String.Concat(str1, str2, str3, str4)。该方法内部会计算总的 String 长度,仅分配一次,并不会如通常想象的那样分配三次。

    2、"$"拼接

    $""可以直接将变量拼接到字符串中不用重新分配一个新的字符空间。

    $"Name:{变量1};Age:{变量2}"

    3、StringBuilder

    StringBuilder内部有一个StringBuffer,连接操作不会每次分配新的字符串空间。只有当连接后的字符串超出 Buffer 大小时,才会申请新的 Buffer 空间。

    例:StringBuilder str1 = new StringBuilder(500);
      for ( int i = 0 ; i < item.Count; i ++ )
      {
        str1.Append (item[i]);
      }

    Tips:StringBuilder 内部 Buffer 的缺省值为 16 ,这个值实在太小。按 StringBuilder 的使用场景,Buffer 肯定得重新分配。经验值一般用 256 作为 Buffer 的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这个值来设定 Buffer 的初值。使用 new StringBuilder(256) 就将 Buffer 的初始长度设为了256。

    4、避免不必要的调用ToUpper 或ToLower 方法

    String是不变类,调用ToUpper或ToLower方法都会导致创建一个新的字符串。如果被频繁调用,将导致频繁创建字符串对象。这违背了前面讲到的“避免频繁创建对象”这一基本原则。

    Compare 方法可以忽略大小写,一定场景可以避免使用ToUpper或ToLower

    5、最快的字符串大小比较方法

    将String对象的Length属性与0比较是最快的方法:if (str.Length == 0)

     其次是与String.Empty常量或空串比较:if (str == String.Empty)或if (str == "")

    注:C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量不会重复分配。

  • 相关阅读:
    战略威慑 51nod提高组试题
    赛艇表演 51nod提高组模拟试题
    Emiya家今天的饭 NOIP2019 (CSP?) 类DP好题 luoguP5664
    华容道题解 NOIP2013 思路题!
    (板子) 最小生成树 买礼物 luogu P1194
    (板子)并查集(递归+循环)
    校园网络 luogu P2812 (又是强联通)
    货车运输 noip2013 luogu P1967 (最大生成树+倍增LCA)
    Codeforces Round #684 (Div. 2)
    Codeforces Round #683 (Div. 2, by Meet IT)
  • 原文地址:https://www.cnblogs.com/bzpfly/p/13792283.html
Copyright © 2020-2023  润新知