zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

c# 操作 -- 字符串 垃圾 回收 压力 减少
2023-09-14 09:02:13 时间

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 == "")

String.Compare可实现忽略字符串大小写
//不推荐的写法

if(s1.ToUpper()==s2.ToUpper()) …;

//推荐的写法

if(String.Compare( s1, s2, true ) == 0) …;

如果要构造一个较长的字符串,尤其是拼接超过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 i++)

 sb.Append(i);

string s = sb.ToString();

//建议修改为

StringBuilder sb = new StringBuilder(256);

for (int i = 0; i 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、待续




jvm调优【减少GC频率和Full GC次数】中Gc是什么 1. Java中为什么会有GC机制呢 2. 对于Java的GC哪些内存需要回收 内存运行时 JVM 会有一个运行时数据区来管理内存。它主要包括 5 大部分:程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap). 3. Java的GC什么时候回收垃圾 在 Java,C#等语言中,比较主流的判定一个对象已死的方法是:可达性分析(Reachability Analysis).
STL中有哪些副作用或稍不注意会产生性能开销的地方? 可能很多人都不在意,在使用STL容器的时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)的。但是其实不然。我感觉可能是很多人都知道对于vector而言,clear()之后,修改了size()的结果,不影响capacity()的结果,因而得出clear()只是修改了某个标记,是常量时间复杂度的错误结论。
又抓到一个导致频繁GC的鬼——数组动态扩容 本周有个同事过来咨询一个比较诡异的gc问题,大概现象是,系统一直在做cms gc,但是老生代一直不降下去,但是执行一次jmap -histo:live之后,也就是主动触发一次full gc之后,通过jstat -gcutil来看老生代一下就降下去了,初看下理论上不太可能,因为full gc也会对old做回收,于是我要同事针对他们的场景写了一个简单的demo出来,然后果然还真能重现,不过他的demo设置的Heap有32G,于是我通过慢慢调整,最终在很小的内存下也能重现出来。
JavaScript的垃圾回收机制,清除无用变量,释放多余内存,展现更好的性能 本篇文章将讲解一下javascript的垃圾回收机制。同时,我们必须先具备作用域链的概念,不懂的小伙伴可以先花3分钟观看一下这篇文章,简单了解一下作用域链的知识——从零开始讲解JavaScript中作用域链的概念及用途