QNetworkReply, QNetworkAccessManager - загрузка файла по HTTPS - высокая загрузка ЦП - PullRequest
0 голосов
/ 01 мая 2019

Я создал загрузчик файлов с помощью 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?

1 Ответ

0 голосов
/ 02 мая 2019

Загрузка ЦП с wget и загрузка с помощью Qt практически одинаковы. Поэтому я думаю, что эти загрузки процессора являются нормальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...