Qt程序CPU過高怎麼定位解決?Qt程序性能優化

自己開發的一個程序採用多線程調用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秒左右;

 

自己開發了一個股票軟件,有很多特殊功能,有興趣的掃碼獲取

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章