Qt6 Windows slower than Qt6 Ubuntu
-
@Joe-von-Habsburg You should read more carefully what others write. What @JonB suggested is that you try to get the data with a non Qt application on both platforms to see whether the behaviour is the same or not...
-
@jsulm I used javascript for get request.
const deneme = async() => { while(true){ var date1 = new Date(); var res = await fetch('http://localhost:54664/sample') var data = await res.json(); console.log("sample len : ",data.samples[0].length) var date2 = new Date(); var res2 = await fetch('http://localhost:54665/sample') var data2 = await res2.json(); console.log("sample len : ",data2.samples[0].length) var date3 = new Date(); console.log("sample : ", date2-date1, " - iq : ", date3 - date2, " - time : ", date3 - date1); } } deneme();
I saw same times between ubuntu and windows (90ms).
I think the problem is in windows Qt. Any idea ? -
@Joe-von-Habsburg You should try to do your networking properly: without local event loops. Qt is asynchronous.
-
... And you should/must not recreate the QNetworkAcceesManager every time.
-
@Christian-Ehrlicher said in Qt6 Windows slower than Qt6 Ubuntu:
And you should/must not recreate the QNetworkAcceesManager every time.
This work for me. Thank you so much :)
-
I have another question. I received some times between ubuntu and windows (65ms). Everything is ok. But, sometimes windows rising 350ms for one packet. In ubuntu just max 80ms.
QByteArray DataReceiver::getData(int port) { QString url = QString("http://localhost:%1/sample").arg(port); _apiUrl.setUrl(url); _request.setUrl(_apiUrl); _reply = _manager.get(_request); connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit); _loop.exec(); if (_reply->error() == QNetworkReply::NoError) { QByteArray responseData = _reply->readAll(); _reply->deleteLater(); return responseData; } else { QString _error = tr("Error"); QString _spectrum_error = tr("Spectrum error."); QMessageBox::critical(nullptr, _error, _spectrum_error); stop(); } _reply->deleteLater(); return NULL; }
Do you know, why it's rising ? What can I do another, after take data ?
-
@Joe-von-Habsburg I found the reason. Thanks a lot :) <3
-
@Joe-von-Habsburg And what was the reason? Windows defender?
-
@Volker75 said in Qt6 Windows slower than Qt6 Ubuntu:
And what was the reason? Windows defender?
another networkmanager.....
@Christian-Ehrlicher , @JonB , @jsulm
Hi guys, I need your help. When I run the my program (only data receive) after 30min, my ram will be 20gb. It's increase always. I tested it in Ubuntu and Windows and I saw same thing. What should I do after take data?
QByteArray DataReceiver::getData(int port) { QString url = QString("http://localhost:%1/sample").arg(port); _apiUrl.setUrl(url); _request.setUrl(_apiUrl); reply = _manager.get(_request); connect(reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit); _loop.exec(); if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); reply->deleteLater(); return responseData; } else { QString _error = tr("Error"); QString _spectrum_error = tr("Spectrum error."); QMessageBox::critical(nullptr, _error, _spectrum_error); stop(); } reply->deleteLater(); return {}; }
if I use my code like that :
QByteArray DataReceiver::getData(int port) { QString url = QString("http://localhost:%1/sample").arg(port); QUrl _apiUrl(url); QNetworkRequest _request(_apiUrl); QEventLoop _loop; QNetworkAccessManager _manager; QNetworkReply *reply = _manager.get(_request); connect(reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit); _loop.exec(); if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); reply->deleteLater(); return responseData; } else { QString _error = tr("Error"); QString _spectrum_error = tr("Spectrum error."); QMessageBox::critical(nullptr, _error, _spectrum_error); stop(); } reply->deleteLater(); return {}; }
Memory will not rise but response time slow....
-
@Joe-von-Habsburg
Is the difference due to theQNetworkAccessManager _manager;
or to theQNetworkReply *reply = _manager.get(_request);
?
In the bad case you might connect toreply->destroyed()
to make sure it is indeed getting freed. -
According to my tests, if I rebuild the NetworkManager, my memory usage does not increase. But this time my receiving time is slowing down.
If I do not recreate the NetworkManager, my reception time decreases but memory usage increases.
connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
it's work, reply deleted
-
@Joe-von-Habsburg
In that case please replace the second one'sQNetworkReply *reply = _manager.get(_request);
with the first one'sreply = _manager.get(_request);
(I assumereply
is a member variable,this->reply
) and confirm. Then the only difference is the localQNetworkAccessManager _manager
versus a class member one. -
@Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:
connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
sorry for that. this is work only when I stop my while loop. How can force it ?
@Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:
void DataReceiver::start() { _connection++; if(_connection > 1) return; qDebug() << "Starting take data"; _takeData = true; while(_takeData){ QDateTime time1 = QDateTime::currentDateTime(); _sample = getData(54664); QDateTime time3 = QDateTime::currentDateTime(); if(_takeIQData) _iq = getData(54665); QDateTime time2 = QDateTime::currentDateTime(); qDebug() << "sample : " << time3 - time1 << " iq : " << time2 - time3 << "time : << time2 - time1; emit sendData(_sample, _iq); } qDebug() << "Finished taking data"; }
@JonB said in Qt6 Windows slower than Qt6 Ubuntu:
n that case please replace the second one's QNetworkReply *reply = _manager.get(_request); with the first one's reply = _manager.get(_request); (I assume reply is a member variable, this->reply) and confirm. Then the only difference is the local QNetworkAccessManager _manager versus a class member one.
I change it.
_reply and _manager class member nowQByteArray DataReceiver::getData(int port) { QString url = QString("http://localhost:%1/sample").arg(port); QUrl _apiUrl(url); QNetworkRequest _request(_apiUrl); QEventLoop _loop; _reply = _manager.get(_request); connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit); connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted); _loop.exec(); if (_reply->error() == QNetworkReply::NoError) { QByteArray responseData = _reply->readAll(); _reply->deleteLater(); return responseData; } else { QString _error = tr("Error"); QString _spectrum_error = tr("Spectrum error."); QMessageBox::critical(nullptr, _error, _spectrum_error); stop(); } _reply->deleteLater(); return {}; }
The problem still exists.
I think lots of reply are created and they only delete I stop my loop.
-
@Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:
I think lots of reply are created and they only delete I stop my loop.
I do not follow this. One reply per
_manager.get(_request)
, and you have checked that is getting destroyed.Supposedly, the only difference now is that in good case you create and destroy a local
QNetworkAccessManager _manager
each time (hence slower) while in bad case you reuse member variable. Right?In that case can only suggest you try playing with stuff to see if it makes any difference in the bad case. QNAM has a couple of caches you can clear (see docs), try those. Try calling its
setAutoDeleteReplies(true)
. Try making the member variable aQNetworkAccessManager *_manager
which younew
anddeleteLater()
ordelete
and instead create a new one in the member variable each time its destroyed for use next time. That would "emulate" having it as a local variable which gets automatically created & destroyed in the good case.Other than that I am out of ideas. maybe someone expert will comment.
-
@JonB said in Qt6 Windows slower than Qt6 Ubuntu:
One reply per _manager.get(_request), and you have checked that is getting destroyed.
I can't delete _reply after get data.
_reply->deleteLater();
I used connect function, I saw this result: when I stop loop, _replys will be deleted (lots of delete).
connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted); void DataReceiver::replyDeleted() { qDebug() << "reply deleted."; }
Result :
@JonB said in Qt6 Windows slower than Qt6 Ubuntu:
Supposedly, the only difference now is that in good case you create and destroy a local QNetworkAccessManager _manager each time (hence slower) while in bad case you reuse member variable. Right?
Yes you right, if I do not use as local member (_manager), response time slow, but I use as local member, memory leak.
@JonB said in Qt6 Windows slower than Qt6 Ubuntu:
ry calling its setAutoDeleteReplies(true). Try making the member variable a QNetworkAccessManager *_manager which you new and deleteLater()
QByteArray DataReceiver::getData(int port) { QString url = QString("http://localhost:%1/sample").arg(port); QUrl _apiUrl(url); QNetworkRequest _request(_apiUrl); QEventLoop _loop; _manager = new QNetworkAccessManager(); _manager->setAutoDeleteReplies(true); _reply = _manager->get(_request); connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit); connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted); _loop.exec(); if (_reply->error() == QNetworkReply::NoError) { QByteArray responseData = _reply->readAll(); _reply->deleteLater(); _manager->deleteLater(); return responseData; } else { QString _error = tr("Error"); QString _spectrum_error = tr("Spectrum error."); QMessageBox::critical(nullptr, _error, _spectrum_error); stop(); } _reply->deleteLater(); return {}; }
I added them my function, but now slow time and memory leak exist together.
@JonB said in Qt6 Windows slower than Qt6 Ubuntu:
Other than that I am out of ideas. maybe someone expert will comment.
Thank you, Anyone can help me, I will be honered.
-
@JonB said in Qt6 Windows slower than Qt6 Ubuntu:
setAutoDeleteReplies(true)
this is crashed my program when I do something.
if I do it :
_manager.setAutoDeleteReplies(true);
memory and speed ok, but program crashed anytime , when I do anything. because reply deleted. why ?
-
@Joe-von-Habsburg
I would guess you need to not delete it yourself now (_reply->deleteLater()
) since it is being auto-deleted onQNetworkReply::finished
?However if it is being auto-deleted on
finished
then, because you do_loop.exec();
which waits forfinished
I would guess you can no longer do_reply->readAll()
after the loop, that sounds like crash. You could instead do your data reading inside the loop instead of afterwards.I really don't know, and have never used any of this stuff :) It was suggestions for narrowing down where the "leakage" might be. But you need someone else if you need someone who truly knows about it.