Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP Indy Client/Server Performanceproblem (https://www.delphipraxis.net/92233-tcp-indy-client-server-performanceproblem.html)

alzaimar 16. Mai 2007 14:50


TCP Indy Client/Server Performanceproblem
 
Ahoj, liebe Gemeinde

Derzeit muß ich einen Cache entwickeln, der per TCP mit clients kommuniziert. Er soll aus einer DB nur die Daten laden, die sich verändert haben usw....

Die erste Testanwendung habe ich mit Datasnap und einer TSocketConnection gemacht: Für ca. 5.5MB Daten verbrät das Teil 1600ms (ca. 3.4MB/sec). Ups, dachte ich mir geht das nicht schneller? (ich hab ein 100mb Netz, und Dateien kopieren kann ich mit 8MB/sec). Also Mal die Indies angeschaut, is ja simpel, einen TCPServer in den Cache-Manager, einen TCP-Client in den Test-Client und ab gehts..

... Denkste. Genauso 'schnell'.

So sieht der Code aus.

Delphi-Quellcode:
Procedure TfmMain.TCPSvrExecute(AThread: TIdPeerThread);
Var
  sQuery, sResponse : String;

Begin
 With AThread.Connection Do Begin
    sQuery := ReadLn;
    LoadData (sQuery, sResponse);
    c := GetTickCount;
    WriteLn(sResponse);
    lbInfo.caption := IntToStr(GetTickCount - c)+' Tics'; // <--- Zeigt 40ms
    Disconnect;
  End;
End;
Und im Client (Button-Ereignis)
Delphi-Quellcode:
Procedure TForm6.btTCPClick(Sender: TObject);
Var
  sResponse, sQuery : WideString;
  c: Cardinal;

Begin
  c := GetTickCount;
  sQuery := 'Auftragsdaten';
  With TCPClnt Do Begin
    Try
      Connect;
      WriteLn(sQuery);
      c := GetTickCount;

      sResponse := ReadLn;
      lbInfo.Caption := IntToStr(GetTickCount - c) + ' tics';// <-- 1670 Tics

    Finally
      Disconnect;
    End;
  End;
End
Sind da die Indies an ihren Grenzen oder kann man irgendwo etwas tunen?

Danke im Voraus.

Real_Thunder 16. Mai 2007 15:53

Re: TCP Indy Client/Server Performanceproblem
 
Ich vermute mal es ohne ausgaben in der schliefe...
bei einem alten project, es ging darum mysql datensätzte in eien ini datei zu schrieben, hatte ich mich auch gewundert warum es so lange dauerte...

Durch lages hin und hertesten habe ich herausgefunden das es die ausgaben waren die das ganze gestoppt hatten.
Als ich die ausgaben... also habe ihc die ausgaben weggelassen.. und schwupps.. das ganze war in 12 sekunden fertig, vorher
hat es um die 8 min gedauert.

Also einfach mal die ausgaben auskommatieren, und erst nach ablauf der schleifen den engültigen wert anzeigen

alzaimar 16. Mai 2007 16:13

Re: TCP Indy Client/Server Performanceproblem
 
Welche Ausgaben? Da sind keine ....

Real_Thunder 16. Mai 2007 16:27

Re: TCP Indy Client/Server Performanceproblem
 
lbinfo.caption z.b.

ich weiß nu nicht das du ja sagtest sind es 5.5. mb.. sie wird er ja nicht mit einmal auslesen können also
macht er es in ner schleife.... in der du dan auch die caption aktualisierst...


oder ich habe den ganzen kram falsch verstanden...

wenn ja, dann sorry, habe noch nicht mit indy's gearbeitet.. mache das alles mit sockets

alzaimar 16. Mai 2007 16:30

Re: TCP Indy Client/Server Performanceproblem
 
Die 5.5MB gehen in einem Rutsch rüber. Mit 3.3MB/sec

Real_Thunder 16. Mai 2007 16:44

Re: TCP Indy Client/Server Performanceproblem
 
wir reden doch hier über eine netzwerkübertragung richtig ?
also ist es quasi ein sendstream,
und er holt dsich also die db daten und verschickt diese dann....

ich weiß nun nicht wie groß der puffer ist... aber 5mb... und das onread ereigns durchläuft jede ms den puffer und holt die daten raus...
ok es kann sein das es bei den indies ein wenig anders funktioniert..

ich hatte bei einer datei von 2.4 mb größe, über 30 durchläufe

Udontknow 16. Mai 2007 17:17

Re: TCP Indy Client/Server Performanceproblem
 
Hallo!

Probiere es mal mit Streams anstelle der Methoden ReadLn/WriteLn. Also Write(Stream) und ReadStream einsetzen...

Cu,
Udontknow

alzaimar 17. Mai 2007 07:26

Re: TCP Indy Client/Server Performanceproblem
 
Hallo,

Ich habe nun ReadStream/WriteStream benutzt, sowie den SendBuffer/Receivebuffer auf 1MB gesetzt. Bringt nichts. Dann habe ich die Daten mit ZLib komprimiert. Inklusive Overhead fürs komprimieren und dekomprimieren steigt dadurch der Bruttodurchsatz auf >5MB/sec und das geht ja.

Udontknow 17. Mai 2007 09:35

Re: TCP Indy Client/Server Performanceproblem
 
Nochmal zum Code oben:

Wenn der Client die Anfrage losschickt, wird ja auf Serverseite vor dem GetTickcount LoadData aufgerufen. Evtl braucht er aber dafür auch Zeit, die du dann natürlich nur im Client-Zeitfenster siehst. Währenddessen wartet der Client ja bereits, sodaß eben die Zeit für LoadData mit im Tickcount des Clients ist. Da das sehr wahrscheinlich eine Datenbankabfrage ist, wird hier bestimmt die eine oder andere Millisekunde vergehen.

Cu,
Udontknow

alzaimar 17. Mai 2007 11:58

Re: TCP Indy Client/Server Performanceproblem
 
Schau nochmal genau hin: Ich messe auf Serverseite die reine Zeit, die für's verschicken drauf geht (die interessiert mich gar nicht, sie dient nur zum Vergleich).

Auf Clientseite wird die Zeit gemessen, die für das ReadStream verbraten wird (nun gut, das Label.Caption setzen ist auch dabei).


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz