穿越之色妃倾城下载客户发现我们公司一个程序员写的程序占CPU占用率过高,这个程序员自查了一圈也没有查出问题出在哪,于是就让我去看他代码,看看是不是哪里写得有问题。其实,他写的这个软件我是知道的,并没有什么太大的数据要算,因此,我判断导致他写的程序占用CPU过高的原因,可能是他写的程序里可能“死循环”。于是,我就问他整个程序里,使用“死循环”的地方有多少,于是,他就给我指了两个地方。
我们公司代码里写“死循环”一般很常见,大多数情况下都是用来让AB程序保持通讯心跳的,还有就是通过“死循环”去获取某个内存指针内的内容的。他写的这两个死循环正好对应了这两个场景,一个是用来检测AB程序心跳,一个是用来循环获取内存指针内容的。
我先查看了下检测AB程序心跳的死循环,没有发现问题,这个循环是每秒获取一次内存指针里面的内容,循环有控制,获取一次内存中的内容,就手动阻塞1秒。这种情况下,一般不会出现CPU占用率过高的问题。
那么,很可能就是检测AB程序心跳的“死循环”出现了问题,果不其然,我看了一眼代码,就知道问题出现的根源。
他的“死循环”逻辑是,先检测A程序是否已经连接上了B程序,当A程序未连接上B程序的时候,调用AB程序的连接方法重连AB程序,若始终连不上,则等待1秒后继续执行。
这个逻辑本身没有问题,但是,这个程序员在写这段代码的时候,估计太想当然了,在控制“死循环”的时候,只控制了当A程序连不上B程序的时候的逻辑,也就是说,这个“死循环”里有一个判断语句,当语句成立的时候,重连AB程序,并等待1秒,继续执行,而当语句不成立的时候,则继续循环,没有任何循环控制。
所以,这个程序在AB程序已经建立连接的情况下,“死循环”是没有控制的,在1秒内执行多少次都有可能,这就是导致CPU占用率过高的“元凶”!
其实,不管怎么样,“死循环”内的条件是否成立,循环都得等待1秒再继续执行,所以,他写的逻辑肯定是有问题的。
于是,我就让他在“死循环”内部的判断语句外面再加一个1秒的阻塞,然后再部署到客户那边,问题成功解决!
其实,代码写成这样我并没有怪他,因为很多时候我们写代码就是这样,明明很简单的问题经常因为写代码写“陷进去”了我们自己不知道。
他之所以一直没发现,主要和他电脑配置有关,他自己用的电脑是那种比较高端的游戏本,即使CPU占用率跑到50%,对他来说也没什么感觉,即使有感觉,可能也不会太长。因为软件在开发过程中不可能一直在那运行。
但是,客户那边的机器配置则比较一般了,CPU出现一般性波动,可能电脑都会出现比较卡的情况,软件运行时间越长,感受越明显。
|