最近的项目用到了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. [thinkphp]查看thinkphp系统定义的常量值

    echo 'MEMORY_LIMIT_ON: ' . MEMORY_LIMIT_ON . '<br>'; echo 'THINK_PATH: ' . THINK_PATH . '<b ...

  2. Codeforces Round #444 (Div. 2)A. Div. 64【进制思维】

    A. Div. 64 time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  3. URl 传参时+号变成空格

    前端用base64加密后的数据,传递到后台时发现一个问题: 比如 韩飞 这个名字,base64加密后的字符串为 6Z+p6aOe 但是后端接受到参数为: 6Z p6aOe +号变成了空格,导致后台解密 ...

  4. 我学MSMQ(一)

    一.通过这篇文章主要是对自己学习MSMQ进行小结,并希望能把自己的想法写出来,能和一些也正在研究MSMQ的朋友共同学习,并希望能给予指导和建议         二.首先是MSMQ的一些理论上的知识   ...

  5. 非常老的话题 SQLSERVER连接池

    原文:非常老的话题 SQLSERVER连接池 非常老的话题 SQLSERVER连接池 写这篇文章不是说要炒冷饭,因为园子里有非常非常多关于SQLSERVER连接池的文章,但是他们说的都是引用MSDN里 ...

  6. RS-232

    RS-232 锁定 同义词 rs232一般指RS-232 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . 个人计算机上的通讯接口之一,由电子工业协会(Electronic Industr ...

  7. What is the purpose of mock objects?

    Since you say you are new to unit testing and asked for mock objects in "layman's terms", ...

  8. VBA Collection用法总结

    Sub test() ' Dim s As Collection '定义s变量为集合对象 ' Set s = New Collection '初始化集合对象s (否则无法使用) Dim s As Ne ...

  9. 资源相互引用时 需添加 PerformSubstitution=True

    获取或设置一个布尔值,该值确定在对由 WebResourceAttribute 类引用的嵌入式资源的处理过程中是否分析其他 Web 资源 URL,并用到该资源的完整路径替换. 如:一个CSS文件引用其 ...

  10. 详细理解javascript中的强制类型转换

    将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况:隐式的情况称为强制类型转换,JavaScript 中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值. 如何理解: 类型转换 ...