最近的项目用到了QT 5.5,项目在运行过程中出现了一段时间CPU占用率持续25%,并频繁断网的情况,遂决定对项目性能进行优化。

优化工具也是VS2010自带的性能分析工具,具体的使用方法参见:http://www.cnblogs.com/smark/archive/2011/10/12/2208039.html

其中可以选择“just my code”过滤出自己编写的代码。

通过性能分析工具可以找到占用CPU时间较多的函数,然后按照占有时间多少进行优化->再分析->再优化的步骤,多次优化后,将CPU占用率降到了2%以下。下面将对性能优化提升较大的几个优化步骤进行记录:

1.优化字符串格式化方法。

项目中有将QByteArray中的二进制数如”123”格式化成”31, 32, 33”的功能,使用的代码如下:

 QByteArray msg = xxx

 QString  str;

 foreach (quint8 b, msg)

 {

     str.append(QString().sprintf(“%02X”, b));

 }

当msg中包含6,7w个字符时,在lz酷睿2代i5的机器上,这段代码需要执行4到5s,因为其中的QString会调用new函数6,7w此,对性能影响极大。优化后的代码如下:

 QString  buildString(const QByteArray& ba)

 {

 static const char ascii[] = {‘’, ‘’, ‘’,‘’,‘’,‘’,‘’,‘’,‘’,‘’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};

 QString buf;

 buf.resize(ba.length() * );

 int i = ;

 foreach (quint8 b, ba)

 {

     buf[i] = ascii[b >> ];

     buf[i + ] =ascii[b & 0xF];

     buf[i + ] = ‘, ’;

     i += ;

 }

 if (i > )

     i –= ;

 buf[i] = ‘\’;

 return buf;

 }

重新运行后,CPU耗时120ms左右,性能提升了几十倍。

2.优化界面刷新

在界面功能中有一处表格显示的功能,显示接收到的数据,在原始的代码中,当接收到一条数据,填充到表格上时,就调用一次表格scrollTo方法,当1s接收到2,3百条数据时,就会调用2,3此scrollTo方法,直接导致了界面频繁更新。

优化的方法是,考虑到人眼的观察能力,将刷新频率即scrollTo的函数调用固定为1s一次,减少了2,3百此的界面重绘,降低了CUP负载。

3.优化更新时戳功能

项目中有一处更新时戳的功能,记录某些状态是否已经超时,原始代码中通过QDateTime记录时戳,当数据到来时会调用QDateTime::currentDateTime更新时戳,当有大量数据到来时会频繁更新时戳,通过性能分析发现此处调用总CPU使用率的7%。考虑该时戳只需要统计时间间隔,遂优化后改用time.h中的clock函数打时戳,该函数返回至程序启动的毫秒数。再次进行性能分析显示此处调用降到CPU使用率的0.23%,性能提升明显。

4.优化数据库操作

项目中有一处数据库记录update操作,将QByteArray更新到数据库中,程序中使用了QT中的储存过程API,将QByteArray变量绑定到QSqlQuery对象上,参考代码如下:

 QSqlQuery query(db);

 QByteArray data;

 query.prepare(“update table set data = ? where id = ?”);

 query.bindValue(, data);

 query.bindValue(, id);

其中data中包含6,7w个数据,其中发现程序在query.bindValue(data)上耗时最多,打印日志发现该data中的内容必定为可显示的ascii,遂将代码改为

 query.bindValue(, QString(data));

减少了QByteArray转换成QString的时间。

5.其他

其他优化还包括数据结构的调整,包括将2,3百条数据的数组改成map结构储存等。

总结

当然对软件的优化还是用遵循相应的原则,比如不要过早优化,在项目的初期以代码的稳定性,可读性,可扩展性为主要目标,只有当代码的性能不能满足需求时再进行适当的优化。因为往往对代码的优化会牺牲以上三个特效,所以在软件开发过程中,经常需要平衡这些特性。

QT项目性能调优小记的更多相关文章

  1. 刷到血赚!字节跳动内部出品:722页Android开发《360°全方面性能调优》学习手册首次外放,附项目实战!

    前言 我们平时在使用软件的过程中是不是遇到过这样的情况:"这个 app 怎么还没下载完!"."太卡了吧!"."图片怎么还没加载出来!".&q ...

  2. web前端性能调优

    最近2个月一直在做手机端和电视端开发,开发的过程遇到过各种坑.弄到快元旦了,终于把上线了.2个月干下来满满的的辛苦,没有那么忙了自己准备把前端的性能调优总结以下,以方便以后自己再次使用到的时候得于得心 ...

  3. sqlserver性能调优第一步

    相信不少的朋友,无论是做开发.架构的,还是DBA等,都经常听说“调优”这个词.说起“调优”,可能会让很多技术人员心头激情澎湃,也可能会让很多人感觉苦恼,不知道如何入手.当然,也有很多人对此不屑一顾,因 ...

  4. Java性能调优

    一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JV ...

  5. JVM内存模型与性能调优

    堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...

  6. iOS-------应用性能调优的25个建议和技巧

    性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的 ...

  7. Tomcat+Nginx+Lvs部署方案与性能调优

    立项要求:用户登录并发数达到1000vuser.原项目设计没有Nginx和LVS,经过性能测试并发数最高到400,就报响应超时,且系统资源消耗严重.经过和架构师商议决定先加入Nginx解决负载均衡处理 ...

  8. iOS应用性能调优建议

    本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...

  9. 记一次Web服务的性能调优

    前言 一个项目在经历开发.测试.上线后,当时的用户规模还比较小,所以刚刚上线的项目一般会表现稳定.但是随着时间的推移,用户数量的增加,qps的增加等因素会造成项目慢慢表现出网页半天无响应的状况.在之前 ...

随机推荐

  1. Java IO 学习(六)Java的Direct Memory与IO

    ByteBuffer的源码中有这样一段注释: A byte buffer is either direct or non-direct. Given a direct byte buffer, the ...

  2. PostgreSQL(EXCEPT,INTERSECT)

    except 可以查看表一对表二不一样的数据,有点像是对表一进行表一表二交集的反集的交集,好绕: intersect 可以查看表一和表二一样的数据,求交集: select t1.name,t1.age ...

  3. 理解竞争条件( Race condition)漏洞

    这几天一个叫做"Dirty COW"的linux内核竞争条件漏洞蛮火的,相关公司不但给这个漏洞起了个洋气的名字,还给它设计了logo(见下图),首页,Twitter账号以及网店.恰 ...

  4. 2017 China Collegiate Programming Contest Final (CCPC 2017)

    题解右转队伍wiki https://acm.ecnu.edu.cn/wiki/index.php?title=2017_China_Collegiate_Programming_Contest_Fi ...

  5. [Git]Git 常用的操作命令

    创建本地仓库 git init 获取远程仓库 git clone [url] 例如:git clone https://github.com/you/yourpro.git 创建远程仓库 添加一个新的 ...

  6. 数据库系统入门 | Not Exisits 结构的灵活应用

    教材 /<数据库系统概念>第六版第三章内容 机械工程出版社:实验软件/Qracle 11g 写在前面 用下面的样例1引出我们讨论的这一类方法. 样例1:使用大学模式,用SQL写出以下查询, ...

  7. ios 字体类型设置 倾斜加粗等

    后面加-Bold就是加粗 加-Oblique就是倾斜等 还有不懂请看http://iosfonts.com/ iPhone 5.0 iPad 5.0 Font Families: 58 Font Fa ...

  8. JAVA常见算法题(三)

    package com.xiaowu.demo; //打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. //例如:153 ...

  9. python装饰器的作用

    常见装饰器:内置装饰器:类装饰器.函数装饰器.带参数的函数装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常 ...

  10. ElasticSearch 安装中文分词器

    1.安装中文分词器IK 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 在线下载安装: elasticsearch-plugin.bat ...