性能调优经历三
背景
这是个门禁系统上位机软件,有个监控页面,实时接收设备传来的进出记录,并抓拍和录像。客户反馈说,
软件运行几天就特别卡。
定位问题
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方法
结果
测试环境跑了一个星期,内存和线程数基本稳定。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构