2012-05-25 50 views
3

我試圖分析我的程序,它是一個文件下載程序。我使用5 QNetworkRequest來提高傳輸速度,他們都連接到相同的readyRead()插槽。使用高速互聯網連接時降低readyRead()的CPU成本

我使用QMap緩衝這些字節數組。當下載速度達到例如5 MiB/s時,我發現CPU成本顯着上升,接近100%,每秒鐘調用30次。

對此有任何建議,例如我可以讓QNetworkReply緩衝它的io設備,減少發射的信號量嗎?

UPDATA

我readyReady()做了一些調試輸出: (reply這裏從發件人鑄造())

qDebug() << "Got: " << reply->readAll().length() << " bytes";

而且每秒約30的輸出,每個包含1500字節

+0

你可以顯示你的'readReady'代碼嗎?每秒30個呼叫似乎並不是很大。 – Mat

+0

@Mat https://github.com/CaledoniaProject/Transf0r-Mini/blob/master/downloader.cpp#L406 – daisy

回答

2

快速查看您的代碼後,我有一個提示。您正在使用QByteArray::append成員(downloadBuffers),它爲附加數據實現了內部緩衝。如果您能夠預測您將在每個下載緩衝區中存儲多少數據,請使用QByteArray::reserve以確定數量的數據。如果你不能簡單地保留即1mb,並且每次你的下一個附加將超過當前的QByteArray::capacity,則進步存儲內存1mb。例如,您可以爲每個緩衝區保留downbufferSize。這是一個輕微的優化,但應該給你一些時間

+0

這有很大的幫助,但是,不得不問:'resize()'和'reserve( )'在這裏,我不確定它是否與C++ STL(Vector)相同..文檔對我來說很困惑 – daisy

+0

保留調整內部緩衝區大小,但保持QByteArray認爲它具有與之前進行保留時相同的數據量。 Resize調整內部緩衝區的大小,並告知QByteArray它包含大小字節(未初始化的數據) –