Я создал загрузчик файлов с помощью QNetworkReply и QNetworkAccessManager в C ++ с Qt 5.12.3 .
Когда начинается загрузка файла, загрузка процессора возрастает до высоких значений (особенно на устройстве ARM).
Рабочий стол - процессор i7 @ 4 ГГц - операционная система Linux:
Загрузка процессора составляет 2% -7% в зависимости от скорости загрузки. Среднее использование процессора составляет 5% при максимальной скорости загрузки 20 Мбит / с. Использование процессора одинаково как в отладочных, так и в сборочных версиях.
SBC - ARM cpu @ 1,53Ghz - операционная система Linux:
Загрузка процессора составляет 5% -50% в зависимости от скорости загрузки. Среднее использование процессора составляет 40% при максимальной скорости загрузки 20 Мбит / с. Использование процессора проверено с помощью сборки выпуска.
При загрузке файлов по протоколу HTTPS в Qt нормально загружается процессор, или я что-то упустил?
Код:
Начальная загрузка файла:
qDebug() << "HTTP: starting download FILE" << file_name << "from" << url.toString();
QNetworkRequest req(url);
req.setMaximumRedirectsAllowed(3);
req.setHeader(QNetworkRequest::UserAgentHeader, http_user_agent);
req.setRawHeader("Accept-Encoding", "identity");
req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
const QByteArray range_header_value = "bytes=" + QByteArray::number(curr_file_size) + "-";
req.setRawHeader("Range", range_header_value);
net_reply = nam->get(req);
net_reply->setReadBufferSize(10 * 1024 * 1024);
connect(net_reply, &QNetworkReply::finished, this, &file_downloader::operation_finished);
connect(net_reply, &QNetworkReply::metaDataChanged, this, &file_downloader::metadata_changed);
connect(net_reply, &QNetworkReply::downloadProgress, this, &file_downloader::download_progress);
Я читаю контент с net_reply
каждые 250 мсек:
read_buffer.append(net_reply->read(read_buffer_size));
if(read_buffer.size() >= read_buffer_size)
{
const qint64 bytes_written = file->write(read_buffer);
read_buffer.clear();
if(bytes_written == -1)
{
qDebug() << "Error write to FILE:" << file->fileName() << ". Aborting download";
QTimer::singleShot(0, net_reply, &QNetworkReply::abort);
}
}
Чтобы минимизировать использование процессора, я попытался:
- чтение net_reply в
ReadyRead
сигнале с / без буфера,
- только чтение net_reply без сохранения в файл,
- чтение net_reply с помощью функции
read
и функции readAll
,
- использовать Callgrind и perf profiler в QtCreator - но оба показывают мне большие затраты не на мой код (например: q_SSL_read, __tpstrtab_dax_pte_fault_done)
Любые советы или, может быть, эти загрузки процессора являются нормальными при загрузке файлов по HTTPS?