2012-05-25 2 views
3

Я попытался профилировать мою программу, которая является файловым загрузчиком. Я использую 5 QNetworkRequest для повышения скорости передачи, все они подключаются к одному и тому же слоту readyRead().Уменьшение стоимости процессора readyRead() при использовании высокоскоростного интернет-соединения

Я использую QMap для буферизации этих байтовых массивов.

Когда скорость загрузки достигает, например, 5 Мбайт/с, я обнаружил, что стоимость процессора значительно возросла, почти 100%, readyRead() звонил 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 с точным объемом данных. Если вы не можете, вы можете просто зарезервировать i.e 1mb и зарезервировать память за 1 минуту каждый раз, когда ваше следующее приложение будет превышать текущий QByteArray::capacity. Вы можете, например, зарезервировать downbufferSize для каждого буфера. Это небольшая оптимизация, но должно дать вам некоторое время

+0

Это очень помогает, но пришлось спросить: какая разница между 'resize()' и 'reserve () 'здесь, я не уверен, что это то же самое с C++ STL (Vector) .. документ довольно запутанный для меня – daisy

+0

резерв изменяет размер внутреннего буфера, но держит QByteArray в том, что он имеет тот же объем данных, что и раньше, , Resize изменяет размер внутреннего буфера и сообщает QByteArray, что он содержит байты 'size' (неинициализированных данных) –

Смежные вопросы