c#中容易忽略的性能优化点
统计性能的方法:GC内存和执行时间
private static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
long start = GC.GetTotalMemory(true);
//需要统计内存和时间的操作
GC.Collect();
GC.WaitForFullGCComplete();
long end = GC.GetTotalMemory(true);
long useMemory = end - start;
watch.Stop();
var useTime = (double)watch.ElapsedMilliseconds / 1000;
Console.WriteLine($"memory:{useMemory}::time{useTime}");
Console.ReadKey();
}
性能优化点总结:
- 使用值类型的ToString方法
使用+号连接字符串时,值类型需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大, 因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。
使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。
int num=1;
string str="go"+num.ToString();
- 运用StringBuilder类(循环中)拼接长字符串
String类对象是不可改变的,在处理字符串时,最好使用StringBuilder类,该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。格式化字符串时也尽量使用此类:
StringBuilder s=new StringBuilder();
s.AppendFormat(baseString,param);
- 避免使用ArrayList。
因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用List<T>,大幅提升值类型性能;
- 字符串空判断
使用if
(
string.IsNullOrEmpty(s)) { }或if
(s !=
null
&& s.Length ==0) {}
不要使用:if
(s ==
""
){}
避免循环中创建对象
在循环外创建空对象,循环内赋值使用
try{}catch(){}
catch具体的异常并且不要改变流程
性能低,应避免在循环中使用
- 可复用的对象静态化处理,避免频繁GC
如:配置文件对象:IConfigurationRoot,网络对象HttpClient