Delphi-PRAXiS
Seite 2 von 2     12   

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)

Udontknow 17. Mai 2007 12:16

Re: TCP Indy Client/Server Performanceproblem
 
Hmmm... Gehen wir es mal genau durch.

Client: Sendet Query, führt GetTickcount durch und wartet auf Ergebnis (Aufruf von ReadStream).

Server: Wartet auf Anfrage. Bei Erhalt wird LoadData aufgerufen und das Ergebnis dann versendet.

Die Clientzeit enthält also die Zeit von LoadData + Versand.

Wenn du immer noch skeptisch bist: : Bau mal nach dem LoadData, aber vor dem Server-Gettickcount ein Sleep(10000) ein. Wetten, daß die Clientzeit um 10 Sekunden hochgeht? ;-)

Nur weil du auf Clientseite nun Readstream aufgerufen hast, bedeutet das doch noch lange nicht, daß der Server bereits mit dem Versand der Daten beschäftigt ist.

Cu,
Udontknow

alzaimar 17. Mai 2007 12:37

Re: TCP Indy Client/Server Performanceproblem
 
Ah, jetzt weiß ich, was Du meinst ... :wall:

Ich prüf das morgen nochmal.... Ich meine, das LoadData sind ca. 250ms, dann wären 5.5MB in ca 1300 ms beim Client... Auch zu lahm, aber besser.

Ich meld mich morgen

alzaimar 18. Mai 2007 12:27

Re: TCP Indy Client/Server Performanceproblem
 
So, nochmal geprüft. Die Nettoübertragung liegt bei 1300ms für 5.5MB, ergo 4.2MB/sec, und das ist immer noch zu wenig.

:gruebel:

Udontknow 18. Mai 2007 12:57

Re: TCP Indy Client/Server Performanceproblem
 
Hallo!

Was für eine Art Stream nutzt du? TMemoryStream? Postest du bitte mal die neuen Sende- und Empfangsroutinen?

Bis dann,

Andreas

Udontknow 18. Mai 2007 13:20

Re: TCP Indy Client/Server Performanceproblem
 
Hallo nochmal,

habe eine kleine Testanwendung geschrieben, um die Performance zu prüfen. Ist natürlich auch abhängig von der Hardware (Einstellung der Netzwerkkarten: 100 Mbit/s Vollduplex). Ergebnis:

Client und Server lokal: 10 MB in 234 Ticks. (42 MB/s)
Client auf anderer Maschine: 10 MB in 875 Ticks. (11 MB/s). Das ist nahe am Maximalwert (100 Mbit / 8 = 12.5 MByte).

Hier mal der Code, ist allerdings die neuere Indy-Version und muss dementsprechend angepasst werden...

Client:
Delphi-Quellcode:
procedure TForm67.Button1Click(Sender: TObject);
var Command:Integer;
var Stream:TMemoryStream;
var Size:Int64;
var c:cardinal;
begin
  Command:=0;
  TCPClient.Connect;
  TCPClient.IOHandler.Write(Command);

  Stream:=TMemoryStream.Create;
  try
    Size:=TCPClient.IOHandler.ReadInt64;
    Memo1.Lines.Add('Empfange '+IntToStr(Size)+' Bytes');
    Stream.Size:=Size;
    c := GetTickCount;
    TCPClient.IOHandler.ReadStream(Stream,Size);
    Memo1.Lines.Add(IntToStr(GetTickCount - c) + ' tics');

  finally
    Stream.Free;
  end;
end;
Server:
Delphi-Quellcode:
var Stream:TMemoryStream;
begin
  AContext.Connection.IOHandler.ReadInteger();
  Stream:=TMemoryStream.Create;
  try
    Stream.Size:=1024*1024*10;
    AContext.Connection.IOHandler.Write(Stream.Size);
    AContext.Connection.IOHandler.Write(Stream,Stream.Size);
    AContext.Connection.Disconnect;
  finally
    Stream.Free;
  end;
Bis dann,

Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 2 von 2     12   

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