.net 软件 CPU 占用率高问题处理
一般这种都是因为 代码问题 导致的,比如最经典的就是死循环,而且循环体内,没有做任何的 CPU 抢占丢弃处理,往往这种代码极易引起 CPU 占用率狂飙。
如何发现?
.net 可以通过 Visual studio 的诊断工具来查看CPU、内存使用信息,
1、开启调试
2、打开诊断工具
3、开始记录
4、等待 30 秒以上
5、生成汇报
453.png)]
6、查看汇报信息
通过查看报告可以发现,纳尼?小伙伴的某段代码竟然是一个空死循环,估计是太忙了,写了之后忘了吧,大家都没太留意 CPU 占用率,所以一直把这个问题保留到现在。
如何处理?
其实这个 CPU 占用率过高的问题,是软件经理提出的,当时提出这个问题之后,我在想可能是因为开了很多while(true)的原因吧,因为只有不恰当的死循环才会导致频繁申请 CPU 调用。
根据我的想法,我先是在一些 死循环体内用 AutoResetEvent 来代替 Thread.Sleep(100), 改了好几个,但是毫无效果,CPU 占用率与之前的几乎一致。说明这些优化起到的作用是有限的。况且 Thread.Sleep 是将 CPU 占用权丢弃,更不会引起这个 CPU 占用率过高的问题。
幸好,VS 提供了强大的诊断工具,利用工具可以快速发现问题的根源, 要不然,一个个死循环找下去,真的很费人(除非循环很少)。
1、最粗暴:删除
2、将 Thread.sleep(1) 加入到循环体,从而主动丢弃 CPU 使用权
总结
1、磨刀不误砍柴工,各种工具的都可以多接触,提高效率嘛
2、Sleep(1) 的妙用,此外还有 Sleep(0),大家可以多了解了解