自己開發的一個程序採用多線程調用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秒左右;
自己開發了一個股票軟件,有很多特殊功能,有興趣的掃碼獲取