QT項目性能調優小記


最近的項目用到了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”的功能,使用的代碼如下:

 1 QByteArray msg = xxx
 2 
 3 QString  str;
 4 
 5 foreach (quint8 b, msg)
 6 
 7 {
 8 
 9     str.append(QString().sprintf(“%02X”, b));
10 
11 }
View Code

 

當msg中包含6,7w個字符時,在lz酷睿2代i5的機器上,這段代碼需要執行4到5s,因為其中的QString會調用new函數6,7w此,對性能影響極大。優化后的代碼如下:

 1 QString  buildString(const QByteArray& ba)
 2 
 3 {
 4 
 5 static const char ascii[] = {‘0’, ‘1’, ‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
 6 
 7 QString buf;
 8 
 9 buf.resize(ba.length() * 3);
10 
11 int i = 0;
12 
13 foreach (quint8 b, ba)
14 
15 {
16 
17     buf[i] = ascii[b >> 4];
18 
19     buf[i + 1] =ascii[b & 0xF];
20 
21     buf[i + 2] = ‘, ’;
22 
23  
24 
25     i += 3;
26 
27 }
28 
29 if (i > 0)
30 
31     i –= 3;
32 
33 buf[i] = ‘\0’;
34 
35 return buf;
36 
37 }
View Code

 

重新運行后,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對象上,參考代碼如下:

1 QSqlQuery query(db);
2 
3 QByteArray data;
4 
5 query.prepare(“update table set data = ? where id = ?”);
6 
7 query.bindValue(0, data);
8 
9 query.bindValue(1, id);
View Code

 

其中data中包含6,7w個數據,其中發現程序在query.bindValue(data)上耗時最多,打印日志發現該data中的內容必定為可顯示的ascii,遂將代碼改為

1 query.bindValue(0, QString(data));
View Code

 

減少了QByteArray轉換成QString的時間。

5.其他

其他優化還包括數據結構的調整,包括將2,3百條數據的數組改成map結構儲存等。

 

總結

當然對軟件的優化還是用遵循相應的原則,比如不要過早優化,在項目的初期以代碼的穩定性,可讀性,可擴展性為主要目標,只有當代碼的性能不能滿足需求時再進行適當的優化。因為往往對代碼的優化會犧牲以上三個特效,所以在軟件開發過程中,經常需要平衡這些特性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM