首页 > 编程语言 >Qt程序CPU过高怎么定位解决?Qt程序性能优化

Qt程序CPU过高怎么定位解决?Qt程序性能优化

时间:2023-04-15 23:11:12浏览次数:68  
标签:HisDayArray Qt QVector 程序 item toString push CPU

自己开发的一个程序采用多线程调用url从网络上下载股票数据,一旦开启程序就特别的卡;想着优化一下;授之于鱼,不如 授之以渔;

1.CPU过高排查方法

(1)打开vs的性能探测器;

 

(2)勾选CPU,然后点击开始按钮

 

 

 

 (3)运行一段时间后,点击停止,分析一会会出现下面的CPU使用报告

 

 

 (4)根据这个报告的CPU使用情况,查找函数解决CPU占用高的情况;

 

我发现三处CPU占用过高的情况;

(1)QVector<HisDayMotony> push_front()在进行大量数据存储时非常的耗CPU,CPU总的使用率达到了80%;

分析原因,是QVector的内部存储结构导致,push_front每次都会调整QVector的内部存储结构,然后动态的申请大的空间,再去复制数据到大的内存空间,这样非常耗性能;解决办法,采用push_back代替;但是用push_back,再次分析后,CPU占用了达到了40%左右,还是很高,分析原因,随着插入数据的增加,发现还是会调用reallco函数不断的申请更大的空,然后复制数据去更大的空间;所以又采用批量设置QVector的大小,批量创建对象,然后将数据设置进去;

 

//解析每日的数据
            QJsonArray dayArray = mainobject.value("hisday").toArray();//解析的数组大小
            QVector<HisDayInfo> HisDayArray(dayArray.size());//根据json数组大小,创建同等数量的空对象
            for (int i = 0; i < dayArray.size(); i++)//遍历循环将数据设置进去
            {
                QJsonArray item = dayArray.at(i).toArray();
                if (item.size() >= 10)
                {
                    //HisDayInfo info;
                    HisDayArray[i].strTime = item.at(0).toString();
                    HisDayArray[i].strOpenPrice = item.at(1).toString();
                    HisDayArray[i].strClosePrice = item.at(2).toString();
                    HisDayArray[i].strRisePrice = item.at(3).toString();
                    HisDayArray[i].strRisePersent = item.at(4).toString();
                    //去除末尾的%号
                    if (HisDayArray[i].strRisePersent.right(1) == '%')
                    {
                        HisDayArray[i].strRisePersent = HisDayArray[i].strRisePersent.left(HisDayArray[i].strRisePersent.size() - 1);
                    }

                    HisDayArray[i].strLowsPrice = item.at(5).toString();
                    HisDayArray[i].strHighsPrice = item.at(6).toString();
                    HisDayArray[i].strDealMoney = item.at(8).toString();
                    HisDayArray[i].strChangeHands = item.at(9).toString();
                    if (HisDayArray[i].strChangeHands.right(1) == '%')
                    {
                        HisDayArray[i].strChangeHands = HisDayArray[i].strChangeHands.left(HisDayArray[i].strChangeHands.size() - 1);
                    }
                    //stockInfo.scHisDayInfo.push_back(info);
                }
            }
            stockInfo.scHisDayInfo=std::move(HisDayArray);//通move函数将数据传给返回遍历进行返回,避免二次构造;

 

(2)自定义结构体中使用的string变量,每次使用string保存字符串时,需要创建大量的空间,会占用很高的CPU;

解决办法,就是用QSting代替QString,发现CPU的使用率降低了;

(3)再次分析发现QJsonObject转QVariantMap,然后将QVariantMap析构也占用了很高的CPU;

 

 

这里我是为了调试查看内容的,QJsonValue调试时无法直接查看变量内容,所以加了这个转换来看内容,直接删除;并且把此处的QVector也是批量申请内存空间,代替push_back;

 

最终结果: 

通过上面三处的修改之后,发现CPU使用率由原来的平均80%,降低到25%;下载数据的速度也提高了很多,之前下载4200多个股票的历史数据和实时数据大概要300秒左右;经过性能优化后,下载速度大大提高只要60秒左右;

 

自己开发了一个股票软件,有很多特殊功能,有兴趣的扫码获取

 

标签:HisDayArray,Qt,QVector,程序,item,toString,push,CPU
From: https://www.cnblogs.com/bclshuai/p/17322210.html

相关文章

  • 编写你的第一个 Django 应用程序,第1部分
    让我们通过示例来学习。在本教程中,我们将引导您完成基本投票应用程序它将由两部分组成:一个公共网站,允许人们查看投票并在其中投票。允许您添加、更改和删除投票的管理网站。一、开发环境搭建第一步当然就是安装python,网上教程太多了,不再赘述。第二步当然就是安装django......
  • 前端&后端程序员必备的Linux基础知识
    一从认识操作系统开始1.1操作系统简介我通过以下四点介绍什么操作系统:操作系统(OperationSystem,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;操作系统本质上是运行在计算机上的软件程序;为用户提供一个与系统交互的操作界面;操作系统分内核与外壳(我......
  • 微信小程序后端开发
    微信开发javaSDKhttps://gitee.com/binary/weixin-java-tools<dependency><groupId>com.github.binarywang</groupId><artifactId>(不同模块参考下文)</artifactId><version>4.4.0</version></dependency>微信小程序:weixin-jav......
  • 【小程序】微信小程序基础语法讲解(一)
    目录一、概述二、小程序代码组成1)JSON配置2)WXML模板1、WXML模板常用标签2、view标签与block标签的区别3、条件控制1、wx:if条件控制2、wx:if/else条件控制3、wx:for循环3)WXSS样式4)JS(JavaScript)逻辑交互1、生命周期函数2、事件函数3、双向绑定三、目录结构四、Page构造......
  • 硬件Hi3861移植MQTT
    摘要:本文简单介绍如何移植MQTT参考:https://www.easemob.com/news/7286https://ost.51cto.com/posts/10201http://www.taodudu.cc/news/show-4296838.html适合群体:适用于润和Hi3861开发板文中所有代码仓库:https://gitee.com/qidiyun/hihope-3861-smart-home-kitMQTT工作模式接......
  • 小程序scroll-view和tabbar方法切换回到顶部
    当前页面<scroll-view>里面添加属性scroll-top="{{scroll_top}}"设置竖向滚动条scroll-view小程序官网在data定义scroll_top=0在页面进行scroll-top="{{scroll_top}}px"在onshow进行回到顶部在每次进入页面时onShow(){this.setData({scroll_top:0......
  • 为何vs编译边出来的程序ebp-4存放的不是第一个局部变量?而是security_cookie——本质上
    快速识别 最后那个call就是比较存的随机数和ebp异或的值是否和之前是否一样:    探究security_cookie在程序中的作用 from:https://www.kn0sky.com/?p=66学习环境:Windows1020H2+VisualStudio2019前言在学习看反汇编程序的时候,使用VS2019编译的releas......
  • 小程序直播间发红包开发实战
    大家好,我是小悟说到小程序直播间发红包的功能,以前就写过一篇实现思路和实现过程,有兴趣的请参考 微信小程序直播间开发抽红包功能 ,还是比较实用的。直播间现有的营销工具不足以满足我们的需要,那我们只有自己动手来做了。操起代码就是干,先看下效果。用户领取红包后,金额要放在哪里,那......
  • Linux下安装搭建MQTT服务器-02
    MQTT协议超全面总结:https://blog.csdn.net/JACK_SUJAVA/article/details/124558524MQTT服务端主要用于与多个客户端保持连接,并处理客户端的发布和订阅等逻辑。一般很少直接从服务端发送消息给客户端(可以使用 mqttServer.Publish(appMsg); 直接发送消息),多数情况下服务端都是转......
  • 香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题
    在PyQt开发中,时常需要对控件的值进行校验,如需要校验QCheckBox是否被选中,QLabel是否校验值是否为空等等。在复杂的业务场景下,这类控件如果数量很多,逐个校验就显得麻烦,需要一一获得控件名称,再调用对应的方法来判断是否被选中、是否为空等。而且开发过程中如果多控件做了增减,还需要增......