性能调优经历三
背景
这是个门禁系统上位机软件,有个监控页面,实时接收设备传来的进出记录,并抓拍和录像。客户反馈说,
软件运行几天就特别卡。
定位问题
1.只有个“卡”字无从下手,所有首先要做的就是搭建测试环境,开启抓拍和录像,模拟现场环境
2.每隔几个小时看看内存、CPU、线程数等占用情况,操作下界面看看是否顺畅
3.依次关闭抓拍和录像,重复步骤2
4.非托管代码的内存泄露的排查;
5.确定问题:关闭抓拍,内存占用问题有所改善,但线程数和内存占用还是不断增长,CPU问题不大
解决
1.有些代码在界面主线程中执行时间较长的任务,这种情况用线程来处理;
还有些地方在循环执行某些任务,若不适合用线程处理,可以考虑Application.DoEvents();
2.主要是集合,不能无限制的.Add,加到一定数量删除旧数据;顺便将线程共享的集合换成线程安全的类型,比如ConcurrentDictionary、ConcurrentQueue
3.首先关注timer,可以在开始处stop结束处start来防止重入;
4.排查循环或定时代码中有没有新建线程或异步代码(比如BeginInvoke、Task、SynchronizationContext.Post之类的);
5.一定要用线程处理的地方,尽量考虑线程池,保证线程中的代码产生的异常能够捕获,以免导致异常而不能释放。
6.使用using+stream实现Image类的save和fromfile方法
结果
测试环境跑了一个星期,内存和线程数基本稳定。