C# 字符串操作--减少垃圾回收压力

简介: C# 性能优化细节1、使用string.Empty给一个空字符串变量赋初始值String.Empty是一个指代,而””是具体的实现string filter=“”;//不建议 string filter=string.Empty; //建议2、使用str.Length == 0做空串比较最快的方法:if (str.Length == 0)其次:if (str == S

C# 性能优化细节

1、使用string.Empty给一个空字符串变量赋初始值

  • String.Empty是一个指代,而””是具体的实现
    string filter=“”;//不建议
     
    string filter=string.Empty; //建议

2、使用str.Length == 0做空串比较

  • 最快的方法:if (str.Length == 0)
  • 其次:if (str == String.Empty)或 if (str == "")

3、避免不必要的字符串ToUpper、ToLower类操作

  • ToUpper、ToLower这类方法均会重新生成字符串对
  • String.Compare可实现忽略字符串大小写
    //不推荐的写法
    if(s1.ToUpper()==s2.ToUpper()) …;
    //推荐的写法
    if(String.Compare( s1, s2, true ) == 0) …;

4、巧用StringBuilder进行字符串拼接操作

  • 如果要构造一个较长的字符串,尤其是拼接超过10次时(经验值),应使用StringBuilder做字符串拼接操作。
     
    //不建议:
    string s = null;
    for (int i = 0; i < 10000; i++)
    {
       s += i;
    }
    //建议:
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++)
    {
        sb.Append(i);
    }
    string t = sb.ToString();

5、创建StringBuilder应指定初始大小

  • 默认的初始大小为16,一旦超过即需要Resize一次并增加GC压力。建议根据经验值为其指定初始大小。
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++)
    {
       sb.Append(i);
    }
    string s = sb.ToString();
    //建议修改为
    StringBuilder sb = new StringBuilder(256);
    for (int i = 0; i < 10; i++)
    {
       sb.Append(i);
    }
    string s = sb.ToString();

6、避免滥用StringBuilder

  • 类似str1+str2+str3+str4的字符串拼接操作会被编译为 String.Concat(str1,str2,str3, str4),效率反而高于StringBuilder。String.Concat会一次性确定字符串长度, StringBuilder需要做Resize,适用于多次生成string对象的情况。

7、通过直接设置.Length=0来初始化StringBuilder

  • 根据实验结果,多次使用同一StringBuilder对象时,通过直接设置.Length=0来初始化速度最快。
    StringBuiler sb = new StringBuilder(256);
      ......
    sb.Remove(0, sb.Length); //不建议
    sb.Length = 0; //建议

8、不要使用.Length=0来释放StringBuilder占用的内存

static void test()
{
    StringBuilder sb = new StringBuilder(256);
    for (int i = 0; i < 100; i++)
    {
        sb.Append(i);
    }
    string t = sb.ToString();
    ……//其他不使用变量sb的代码段
    sb.Length = 0; //去掉该句手工清空sb代码,会更早释放内存
}

9、待续



相关文章
JVM08_字符串常量池基本特性、内存分配、拼接操作、intern、StringTable垃圾回收(三)
⑤. intern()的使用 ①. new String("ab")会创建几个对象 ②. new String("a") + new String("b")创建几个对象呢? ③. 关于String.intern( )的面试题 ④. 总结String的intern()的使用
141 0
JVM08_字符串常量池基本特性、内存分配、拼接操作、intern、StringTable垃圾回收(三)
|
1月前
|
Java 程序员
探讨JVM垃圾回收机制与内存泄漏
探讨JVM垃圾回收机制与内存泄漏
|
3月前
|
Web App开发 存储 JavaScript
【JavaScript】垃圾回收与内存泄漏
JavaScript的*垃圾回收机制*是一种自动化的内存管理机制,用于检测和回收不再使用的内存资源,以便重新分配给其他需要的部分。JavaScript中的垃圾回收器负责跟踪和管理内存的分配和释放,使开发人员无需手动管理内存。 *内存泄漏*指的是程序中分配的内存空间无法被释放和回收,并且随着时间推移导致可用内存逐渐减少。
52 0
|
2天前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
6天前
|
存储 前端开发 安全
JVM内部世界(内存划分,类加载,垃圾回收)(上)
JVM内部世界(内存划分,类加载,垃圾回收)
22 0
|
1月前
|
Java 程序员 Python
|
2月前
|
监控 Java 编译器
优化Go语言程序中的内存使用与垃圾回收性能
【2月更文挑战第5天】本文旨在探讨如何优化Go语言程序中的内存使用和垃圾回收性能。我们将深入了解内存分配策略、垃圾回收机制,并提供一系列实用的优化技巧和建议,帮助开发者更有效地管理内存,减少垃圾回收的开销,从而提升Go程序的性能。