AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy-Test optimieren
Thema durchsuchen
Ansicht
Themen-Optionen

Indy-Test optimieren

Ein Thema von stahli · begonnen am 25. Apr 2014 · letzter Beitrag vom 28. Apr 2014
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Indy-Test optimieren

  Alt 25. Apr 2014, 22:18
anstatt für jeden einzelnen Integerwert eine Verbindung zu Server aufzubauen...
Das dürfte eine Verbesserung von 180-fach (!) bringen.
TCP-Verbindungsaufbau: 3 Pakete
TCP-Verbindungsaufbau: 2 Pakete
Das sind dann 300 * (5 + 1) = 1800 Pakete
Schickt man alles auf einen Rutsch sind das: 5 Pakete + ca. 5 Pakete für Nutzdaten = 10 Pakete
1800 / 10 = 180
Die ACK-Pakete habe ich nicht berücksichtigt, aber das dürfte wenig ändern
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Indy-Test optimieren

  Alt 25. Apr 2014, 23:00
Oh Mann, da hätte "man" ja auch mal selbst drauf kommen können.
Es ist ja nachvollziehbar, dass der Verbindungsaufbau immer etwas Zeit kostet.

Jetzt übertrage ich die 301 Werte einfach als String-Liste und lese sie en Block wieder aus.
Das funktioniert hier auf dem PC erst mal ohne sichtbare Verzögerung, auch bei mehreren Clients.

Delphi-Quellcode:
// Server:
  ..
  else if (cmd = '?ALL') then
  begin
    S := IntToStr(T);
    for Index := Low(A) to High(A) do
      S := S + #13#10 + IntToStr(A[Index]);
    SendText(AContext, S);
  end
  ..

// Client:
  ..
  procedure ReadText(FClient: TIdTCPClient; cmd: String; SL: TStringList);
  var
    MS: TMemoryStream;
    I: Int64;
  begin
    FClient.Connect;
    if FClient.Connected then
    begin
      MS := TMemoryStream.Create;
      try
        FClient.Socket.WriteLn(cmd);
        I := FClient.Socket.ReadInt64;
        FClient.Socket.ReadStream(MS, I, false);
        MS.Position := 0;
        SL.LoadFromStream(MS);
        // Result := Copy(SL.Text, 1, Length(SL.Text) - 2); // SL.Text; //
      finally
        MS.Free;
      end;
    end;
    FClient.Disconnect;
  end;
  ..
    ReadText(IdTCPClient1, '?ALL', SL);
    T := StrToInt(SL[0]);

    Index := 1;
    while Index < SL.Count do
    begin
      A[Index] := StrToInt(SL[Index]);
      Inc(Index);
    end;
  ..
Wenn ich später von 1Mio Datensätzen 300 abrufen will, dann werde ich einfach die 300 Id`s, RecNo o.ä. in einer Anfrageliste übergeben und die Ergebnisse dann vom Server aus anfügen und zurück schicken.
Insofern macht es schon Sinn, direkt mit Stringlists zu arbeiten.


Vielen Dank Euch allen für die Hilfe! (und für mjustin ein extra)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Indy-Test optimieren

  Alt 25. Apr 2014, 23:15
Solange man um die Besonderheiten der StringList weiß und die keine Stolperfallen darstellen, kann man die nehmen, wie jedes andere Konstrukt, was sich in einen Stream und wieder zurück wandeln lässt.
Delphi-Quellcode:
sl.Add('test' + sLineBreak + 'data' );
writeln( sl[0] ); // test#13#10data

sl.SaveToStream( sm );
sm.Position := 0;
sl.LoadFromStream( sm );

writeln( sl[0] ); // test
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz