Qt程序性能优化

最近发现项目运行时有卡顿的情况,所以项目的性能做了一些优化,本文对几个优化点进行了记录。

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

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值