c++ - QNetworkReply、QNetworkAccessManager - 通过 HTTPS 下载文件 - 高 CPU 使用率
问题描述
我使用Qt 5.12.3在 C++ 中使用 QNetworkReply 和 QNetworkAccessManager 创建了文件下载器。当下载文件开始时,cpu 使用率上升到很高的值(尤其是在 ARM 设备上)。
桌面 - cpu i7@4GHz - Linux 操作系统:cpu 使用率为 2%-7%,具体取决于下载速度。平均 CPU 使用率为 5%,最大下载速度为 20 Mb/s。调试和发布版本的 CPU 使用率相同。
SBC - ARM cpu @1,53Ghz - Linux 操作系统:cpu 使用率为 5%-50%,具体取决于下载速度。平均 CPU 使用率为 40%,最大下载速度为 20 Mb/s。通过发布版本检查 CPU 使用情况。
在 Qt 中通过 HTTPS 下载文件时 CPU 使用率如此之高是正常的,还是我遗漏了什么?
代码:开始文件下载:
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);
}
}
为了最大限度地减少 CPU 使用率,我尝试:
ReadyRead
在有/没有缓冲区的信号中读取 net_reply ,- 仅读取 net_reply 而不保存到文件,
read
用函数和readAll
函数读取net_reply ,- 在 QtCreator 中使用 Callgrind 和性能分析器 - 但两者都显示我的代码成本高(例如:q_SSL_read、__tpstrtab_dax_pte_fault_done)
通过 HTTPS 下载文件时有任何建议或这些 CPU 使用率是否正常?
解决方案
Qt 使用和下载的CPU 使用率wget
几乎相同。因此,我认为这些 CPU 使用率是正常的。
推荐阅读
- java - 删除对象时的微服务通信
- sas - 在SAS中通过多行分组设置记录的状态
- python - 如何在指定时间内终止函数
- c++ - 如何从 C++ 中的流中获取特定位置的字符?
- php - 将逗号分隔的字符串转换为数组并合并包含在一个变量中的数组
- error-handling - 如何处理包容性 -21、-103 无效值:不在 Dart 中的 RangeError 范围内?
- python - 过滤值的访问索引
- python - Flask-admin 如何删除编辑和删除记录的操作
- javascript - 单击 puppeteer 中的元素后如何等待网络空闲?
- wordpress - 按名称获取多个分类