QNetworkAccessManager语言 - 首先变得非常慢
QNetworkAccessManager - first GET very slow
我在Android上使用Qt 5.5中的QNetworkAccessManager时遇到问题。在此期间,通过 http GET 下载一个简单的小图形文件会导致大量垃圾回收调用和 UI 锁定。后续的 GET 完美运行,无需这些 GC 调用。代码如下:
void DownloadManager::downloadFile(QUrl fromUrl, QString toFilePath) {
_currentFilePath = toFilePath;
QNetworkRequest request;
request.setUrl(fromUrl);
qDebug() << "before";
_currentReply = _mgr.get(request);
qDebug() << "after";
connect(_currentReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
connect(_currentReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64,qint64)));
connect(_currentReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
}
DownloadManager
是一个自定义 QObject 派生类,没有任何与 get 请求相关的特殊功能。 _mgr
是在 DownloadManagers cTor 期间分配的 QNetworkAccessManager 对象。
如您所见,这只是一个 get 请求的教科书示例,没有什么太花哨的。正如我所说:在大多数情况下,它有效。只有第一个 get 请求的结尾是这样的:
D/ .../downloadmanager.cpp:61 (void DownloadManager::downloadFile(QUrl, QString)): before
D/dalvikvm(13298): GC_CONCURRENT freed 2290K, 25% free 10911K/14407K, paused 2ms+3ms, total 29ms
D/dalvikvm(13298): GC_CONCURRENT freed 501K, 25% free 10884K/14407K, paused 13ms+2ms, total 35ms
D/dalvikvm(13298): GC_CONCURRENT freed 524K, 25% free 10892K/14407K, paused 12ms+3ms, total 36ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 6ms
D/dalvikvm(13298): GC_CONCURRENT freed 537K, 25% free 10887K/14407K, paused 2ms+9ms, total 32ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 14ms
D/dalvikvm(13298): GC_CONCURRENT freed 840K, 25% free 10899K/14407K, paused 12ms+3ms, total 38ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 11ms
D/dalvikvm(13298): GC_CONCURRENT freed 1294K, 25% free 10901K/14407K, paused 2ms+2ms, total 27ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 11ms
D/dalvikvm(13298): GC_CONCURRENT freed 1187K, 22% free 11330K/14407K, paused 2ms+2ms, total 30ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 15ms
D/dalvikvm(13298): GC_CONCURRENT freed 1459K, 19% free 11919K/14535K, paused 13ms+4ms, total 64ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 18ms
D/ .../downloadmanager.cpp:65 (void DownloadManager::downloadFile(QUrl, QString)): after
我根本不明白是什么原因导致这么多 GC 发生 - 一切都需要整整到一秒半的时间才能解决(对于应该需要一瞬间的下载,而且是异步的并且不锁定 UI)。
附加信息:
始终只有第一次下载才会触发此操作。后续下载,即使是完全相同的文件,也能完美运行
在确切位置是否有具有确切名称的文件并不重要。 下载文件,删除它,返回应用程序并重新下载它提供相同的结果 - 第一个get很慢并且有GC,第二个工作得很好。
我从QML文件中调用所有这些,这会导致单例c ++对象调用DownloadManager::d ownloadFile。
除了 QML UI 之外,应用程序中没有其他任何内容在运行。没有繁重的数据交换,没有其他线程上的后台加载,什么都没有。
我将感谢解决这个问题的任何指示。
在Android上尝试,但我在Windows上遇到了同样的问题。因为这些是相同的症状,我会说这可能是相同的原因,即实现在第一次 get() 调用时懒惰地加载一些共享库。使用加密连接时尤其如此;就我而言,我可以在Visual Studio中看到在第一次get()调用时加载了19个DLL。
解决此问题的一种方法是使用 connectToHost 或 connectToHostEncrypted 预连接到服务器,具体取决于您是否使用加密连接(例如 HTTPS)。我在应用程序启动时调用它,但是每当 UI 空闲时应该没问题。然后后续的 get() 调用都将具有相同的性能,包括第一个,因为库已经加载并且连接已经建立。我假设连接到任何服务器都会加载库。
有关一般错误(并非特定于 Android)的详细信息,请参阅 https://forum.qt.io/topic/65201/qnetworkaccessmanager-first-get-very-slow/14。
- OpenGL大的3D纹理(>2GB)非常慢
- 不同语言中相同代码的不同行为
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 使用浮点数和双精度数的非常小数字的数学
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 了解算法的性能差异(如果以不同的编程语言实现)
- Rextester 语言编译C++问题
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 如何将多种语言设置放在单个 .clang 格式文件中
- 不同语言中的模运算符差异
- 我从int x[3]得到的一个非常奇怪的输出;
- 反向迭代器在C++中非常奇怪的行为
- 刚接触C++,难以理解语言的细微差别
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- QNetworkAccessManager语言 - 首先变得非常慢