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

 

 

 

 

 

 

posted @ 2020-09-03 15:42  Zdelta  阅读(32)  评论(0编辑  收藏  举报