Seite 1 von 1

UDP Durchsatz schlecht

Verfasst: 17. März 2008 10:40
von tigertap
Hello,

i've programmed a test-application in QT4-3-4 for Windows (Commercial eval for VS2003) to get maximum UDP-throghput.
The application is a simple receiver, that gets UDP-datagrams and calculates throughput. We also have a sender (written in C, WinAPI) and several receivers (C, C#, Java...). Now we are testing QT's performance. With C, WSA, we got results of astonishing 900-950MBit/s.
The QT-application has two threads, one for GUI and one only for receiving. I used QUdpSocket-class, but results were as bad as 35-40MBit/s.
What is wrong it?? Has anyone same experiences??
Here is how i did it (only the receiving function in the 2nd thread):

Code: Alles auswählen

void sTestThread::run()
{
	quint32	dgs = 0;

	started = true;
	initRecv();
	while ( started )
	{
		psock->waitForReadyRead( 20 );
		if ( psock->hasPendingDatagrams() )
		{
			fill = psock->pendingDatagramSize();
			psock->readDatagram( buffer, MAX_UDPSIZE, 0, 0 );
			dgs++;
			checkDg();
		}
	}
	deinitRecv();
}
regards and thanks

tigertap

Verfasst: 17. März 2008 10:41
von PeterLustig
Kann das jemand mal übersetzen? :-/
Das hier ist ein deutsches Forum Mensch...

Verfasst: 17. März 2008 10:53
von tigertap
Hello,

Hello,

Entschuldigung.
Wir führen gerade Durchsatz-Tests mit verschiedenen Programmiersprachen durch.
Nun habe ich ein Programm in QT4-3-4 für Windows (Kommerzielle Eval für VS2003) erstellt, dass den max. UDP-Durchsatz testen soll.
Mit anderen Libraries (z.B. WSA) haben wir Durchsätze von bis zu 900-950MBit/s erreicht
Die QT-Anwendung hat 2 Threads, einen zum Empfangen einen für die GUI. Dabei habe ich die QUdpSocket-Klasse verwendet,
aber die Resultate waren schlecht, etwa 35-40MBit/s.
Was geht schief oder hat jemand ähnliche Erfahrungen??

Gruß

tigertap

Verfasst: 17. März 2008 11:50
von solarix
1. Wenn du in mehreren Foren die gleichen Fragen stellst, bitte poste noch die Links dazu, damit jemand beim surfen die Loesung findet..
2. was macht "checkDg()" (code)? Warum ueberhaupt eine GUI parallel zu einem Performance-Test laufen lassen?
3. Wird zwar kaum was ausmachen, aber eigentlich fragst du 2x das gleiche ab:

Code: Alles auswählen

while ( started )
  {
      if ( psock->waitForReadyRead() )
      {
         fill = psock->pendingDatagramSize();
         psock->readDatagram( buffer, MAX_UDPSIZE, 0, 0 );
         dgs++;
         checkDg();
      }
   } 

Verfasst: 17. März 2008 13:26
von tigertap
Hallo,

http://www.qtcentre.org/forum/f-qt-prog ... #post65845

Die Funktion checkDG() berechnet im Wesentlichen den Durchsatz. Auch wenn man diese auskommentiert (man kann ja die Anzahl der empf. Datagramme zählen: var "dgs") verbessert sich der Durchsatz nur geringfügig.
Die GUI soll einfach die Bedienung erleichtern, zumal wir das bei den anderen Testprogrammen auch schon hatten.

Wieso 2mal dasselbe? waitForReadyRead() um die Auslastung klein zu halten und dann im nächsten Schritt mit pendingDatagramSize() die Größe der Nutzdaten im Datagram erfragen oder meinst Du was anderes?


Grüße
Christian

Verfasst: 17. März 2008 21:10
von solarix
ich konnte locker 400-500MBytes/s (Bytes, nicht Bits) messen.. kannst du mal den kompletten Qt-Source attachen?

Verfasst: 17. März 2008 22:26
von upsala
Hübsch, geht das alles über localhost oder was habt ihr für Netzwerkanbindungen...

Verfasst: 17. März 2008 23:22
von solarix
Rauchzeichen waren es auf jeden Fall nicht :wink:
im ernst: ich geh mal davon aus, dass tap nur die Software (via localhost) testen möchte.. bei der ganzen I/O würde sich die Applikation ja nur langweilen und sich kaum ein Unterschied messen lassen..