C# 字符串操作--减少垃圾回收压力
c# 操作 -- 字符串 垃圾 回收 压力 减少
2023-09-14 09:02:13 时间
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中作用域链的概念及用途
相关文章
- C# 系统应用之鼠标模拟技术及自动操作鼠标
- C#控制台关闭时回调操作处理其他操作
- C#串口serialPort操作
- 学C#你应该熟练使用ILDasm和Reflector【带视频教程】
- 《数据结构(C#语言描述)》
- C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
- C# 操作PDF
- C# 文件流相关操作
- C# 文件操作 把文件读取到字节数组
- c# 框架系列 ———— EFCore 模型篇 [一]
- C#.Net操作注册表RegistryKey
- c# 操作Word总结
- C#中三种定时器对象的比较
- C#对Excel的图文操作
- C#调用C++托管类,实现C#和C++的混合编程
- C#.Net中操作XML方法一
- [h5棋牌项目]-15-C#与C++通信
- c# yolo cuDNN Error: CUDNN_STATUS_BAD_PARAM
- C#二进制字节数组操作功能 拦截字节数组SubByte
- C#数学运算表达式解释器
- C#操作注册表32&64位系统
- C# Quartz.Net 定时任务的简单使用
- C#简单操作MongoDB
- C# lock的语法糖原理--《.net core 底层入门》之自旋锁,互斥锁,混合锁,读写锁