最近发现项目运行时有卡顿的情况,所以项目的性能做了一些优化,本文对几个优化点进行了记录。
1、避免频繁触发信号槽
现象
项目中有一项功能是在子线程里读数据,数据若发生变化了就发送信号,在槽里更新界面。
程序运行的时候会出现数据变化很频繁的情况,也导致更新界面的信号在短时间内被触发很多次,大大损耗了程序的性能。
解决方法
因为人眼捕获的帧率有限,所以界面显示不需要太快的刷新速度,把信号槽更新界面改为用定时器更新界面,就能避免某一时间段数据变化过频导致的卡顿问题。
2、设置线程优先级
现象
项目中有多线程的操作,所有的线程都是用默认的QThread::InheritPriority优先级。
因为设备的性能有限,让所有的线程都以高优先级去运行,主线程被过多地占用资源,导致界面刷新卡顿的问题。
解决方法
Qt的线程提供了以下几种优先级(由低到高排列),按照实际情况去设置优先级,可以提高界面的流畅度。
QThread::IdlePriority
QThread::LowestPriority
QThread::LowPriority
QThread::NormalPriority
QThread::HighPriority
QThread::HighestPriority
QThread::TimeCriticalPriority
QThread::InheritPriority
3、检查子线程的延时操作
现象
项目里有一个子线程的代码结构是这样的。
void run() {
while (true) {
if (...) {
continue;
}
..... //operate
msleep(20);
}
}
线程在延时状态下是会把CPU交给其它线程的,避免不停地抢占CPU,以上代码虽然加了延时,但前面有一个判断操作,如果满足了条件,就直接调用continue,如果这个判断条件一直都是满足的,那就会不停地continue,代码也就变成了以下形式。
void run() {
while (true) {
continue;
}
}
等同于一个死循环,这样会大大影响程序的效率。
解决方法
在每个continue前添加延时。
void run() {
while (true) {
if (...) {
msleep(20);
continue;
}
..... //operate
msleep(20);
}
}
或者避免使用continue
void run() {
while (true) {
if (...) {
..... //operate
}
msleep(20);
}
}
4、优化数据查询方式
如果表中数据量大或者查询频率高,可以使用map容器来存放,以空间换时间,减少查询损耗。
5、通信协议的优化
可以通过优化通信协议来减少客户端和服务端的计算量。
6、减少不必要的IO操作
IO操作是比较耗时的,常见的IO有通信IO和文件IO,可以检查相关代码进行优化。
7、优化UI架构
具体可以看我另外一篇文章:https://blog.csdn.net/weixin_45001971/article/details/130658132
8、使用VS性能分析工具
https://blog.csdn.net/weixin_45001971/article/details/128419018