AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TCP Indy Client/Server Performanceproblem
Thema durchsuchen
Ansicht
Themen-Optionen

TCP Indy Client/Server Performanceproblem

Ein Thema von alzaimar · begonnen am 16. Mai 2007 · letzter Beitrag vom 18. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 15:50
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#2

Re: TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 16:53
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 17:13
Welche Ausgaben? Da sind keine ....
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#4

Re: TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 17:27
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 17:30
Die 5.5MB gehen in einem Rutsch rüber. Mit 3.3MB/sec
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#6

Re: TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 17:44
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
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#7

Re: TCP Indy Client/Server Performanceproblem

  Alt 16. Mai 2007, 18:17
Hallo!

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

Cu,
Udontknow
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: TCP Indy Client/Server Performanceproblem

  Alt 17. Mai 2007, 08:26
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#9

Re: TCP Indy Client/Server Performanceproblem

  Alt 17. Mai 2007, 10:35
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: TCP Indy Client/Server Performanceproblem

  Alt 17. Mai 2007, 12:58
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).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr.
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