实战开发经验: 如何降低CPU占用率

jopen 8年前
 

在软件开发和性能测试中,CPU占用率是一个很重要的指标,到底有哪些因素会导致CPU占用率上升呢?又有哪些手段可以降低CPU的占用率呢?本文是“Jhuster的专栏”的《实战开发经验 》系列又一篇文章,简单地总结了一下关于CPU占用率的那些事。

1. 如何测试CPU占用率?

首先,我们要学会如何测试程序的CPU占用率,这里简单地给出最基础的方法:

Windows上可以通过Ctrl+Alt+Del组合调出“任务管理器”,然后查看指定进程的详细信息即可。

Linux/Android平台,可以在命令行输入:top 命令,找到指定进程即可。

注意,测试的时候,一般要分多组情况来测试,比如:空闲时、中等负荷运行时、高负荷运行时……

2. 有哪些因素导致CPU占用率上升?

(1) 复杂计算

运行一些算法处理,比如:音视频编解码、图像处理、科学计算等等,特别是一些浮点数的运算。

(2) 持续占用CPU

某些高优先级的进程/线程持续占用CPU,很少或者从来不sleep,类似 while(1) {}

(3) 数据拷贝

频繁进行大量的数据拷贝。

(4) 频繁的系统调用

比如:频繁调用 printf 打印、读写硬盘、网络收发等等。

3. 有哪些手段可以降低CPU占用率?

(1) 硬件加速

常见的硬件加速有:多核计算、GPU、DMA、音视频的硬件编解码等,很多硬件加速功能需要平台提供API或者驱动支持,在需要优化CPU占用率的时候可以重点关注一下。

(2) 学会“让出”CPU

在程序中,有多种方法可以“让出”CPU,第一种是 sleep,第二种是 await/signal 机制,任何编程语言都会有类似的接口。

另外,还有一种策略:适当降低你的进程/线程的优先级。

(3) 避免频繁的数据拷贝

在多线程编程中,数据拷贝是难免的,但是完全可以通过一些技巧减少一些不必要的拷贝,心中要有这理念,编程时多留点心。

(4) 合并一些系统调用

很多时候,多次打印可以尽量合并到一起再打印、多次硬盘/网络访问请求也可以合并到一起再发送。

4. 小结

关于CPU占用率的那些事就介绍到这儿了,很多地方只是点到而止,并没有完全展开,大家可以搜索相关的文章和资料做深度地优化和分析,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博@卢_俊 或者关注我的微信公众号(@Jhuster)获取最新的文章和资讯。