c#中容易忽略的性能优化点

tech2023-02-28  109

统计性能的方法: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

 

 

 

 

 

 

最新回复(0)