performanceproblem while schleife

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: performanceproblem while schleife

Beitrag von Michl »

Ob es das Performance-Problem ist, weiß ich nicht (habe mich jetzt nicht reingedacht), aber dynamische Arrays starten mit 0 und enden mit High(Dynamisches Array). Wenn du den Rangecheck (-Cr) aktivierst, sollte der Debugger meckern.

Probiere es mal so:

Code: Alles auswählen

for i2 := 0 to High(database) do

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: performanceproblem while schleife

Beitrag von pluto »

Code: Alles auswählen

t1 := PosEx(' ', text , start);
        wort1 := copy(text, start, t1-start);
        t2 := PosEx(' ', text , t1+1);
        wort2 := copy(text, t1, t2-t1);
        t3 := PosEx(' ', text, t2+1);
        folgewort := copy(text, t2, t3-t2);
        start := t1+1;
        t1 := t2+1;
        t2 := t3+1;

Warum ist das in der While Schleife? Macht für mich auf den ersten Blick keinen großen Sinn. Weil sich Text innerhalb der Schleife nicht verändert oder habe ich was übersehen?

Edit01: OK, hat sich geklärt, such mal nach Pointern bzw. PChar das könnte schneller sein.
MFG
Michael Springwald

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: performanceproblem while schleife

Beitrag von Dragon »

@Pluto
die schleife verschiebt den leser
[das ist ein] text der geparsed wird
das [ist ein text] der geparsed wird
das ist [ein text der] geparsed wird
das ist ein [text der geparsed] wird
das ist ein text [der geparsed wird]
hier mal mit den eckigen klammern dargestelt

@Michl ok werde ich mal versuchen

Edit: Ok die änderung auf high hats mal so um ne menge beschleunigt, läuft jetzt in so sofort durch. Was ist an high anders.

Edit2: aber er scheint die while schleife nicht zu verlassen weil er den debugoutput nicht ausgibt
Zuletzt geändert von Dragon am Sa 14. Mai 2016, 20:03, insgesamt 1-mal geändert.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: performanceproblem while schleife

Beitrag von Euklid »

Dragon hat geschrieben:Was ist an high anders.


...das würde mich jz auch interessieren. Dachte length macht genau das.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: performanceproblem while schleife

Beitrag von Michl »

Ein dynamisches Array mit einer Länge von 1 hat genau einen Eintrag an der Stelle 0.
D.h. High gibt 0 zurück, Length 1.

Anders sieht es bei Strings aus, deren Index beginnt bei 1.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: performanceproblem while schleife

Beitrag von pluto »

Ich meine es gibt schon eine string move Funktion, genauso wie es copy und delete gibt....

Edit01:
Jetzt habe ich es verstanden.... Der Text wird nicht verschoben, sondern der Text wird Wordweise verlängert.
MFG
Michael Springwald

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: performanceproblem while schleife

Beitrag von Dragon »

@Pluto nein

Es gibt einen eingabe text der länge n
dieser wird immer in dreierblöcken erfasst wie hier dargestellt
und in ein array of record eingetragen
[das ist ein] text der geparsed wird
das [ist ein text] der geparsed wird
das ist [ein text der] geparsed wird
das ist ein [text der geparsed] wird
das ist ein text [der geparsed wird]
wenn so ein dreierblock mehr als einmal identisch vorkommt, wird kein neuer eintrag im array of record angelegt, sondern der zähler um 1 erhöht, der für jedes dreierpacket seperat vorhanden ist, innerhalb des array of record

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: performanceproblem while schleife

Beitrag von gocher »

Auf jeden Fall würde ich nicht immer wieder die Wörter neu ausschneiden!

Code: Alles auswählen

 
    if  i = 1 then
    begin
      for w := 1 to 3 do
      begin
        t1 := PosEx(' ', text , start);
        wort[w] := copy(text, start, t1-start);
        start := t1 + 1;
      end;
    end
    else
    begin
      wort[1] := wort[2];
      wort[2] := wort[3];
      t1 := PosEx(' ', text , start);
      wort[3] := copy(text, start, t1-start);
      start := t1 + 1;
    end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: performanceproblem while schleife

Beitrag von gocher »

Der folgende Abschnitt noch ungefähr so dann fängt das array Database bei 0 an und der erste Eintrag ist nicht leer:

Code: Alles auswählen

 
    found := false;
    if length(database)>0 then
    begin
      for i2 := 0 to length(Database)-1 do
      begin
        if (Database[i2].Wort1 = wort[1]) and (Database[i2].Wort2 = wort[2]) and (Database[i2].Folgewort = wort[3]) then
        begin
          inc(Database[i2].Anzahl);
          found := true;
          break;
        end;
      end;
    end;
    if not found then
    begin
      t2 := length(Database);
      Setlength(Database, t2 + 1);
      Database[t2].Wort1 := wort[1];
      Database[t2].Wort2 := wort[2];
      Database[t2].Folgewort := wort[3];
      Database[t2].Anzahl := 1;
    end;
 
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: performanceproblem while schleife

Beitrag von gocher »

Der Part

Code: Alles auswählen

 if length(database) < 1 then
      begin
        setlength(database, 1);
      end;

entfällt dann natürlich.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: performanceproblem while schleife

Beitrag von martin_frb »

Code: Alles auswählen

 
 
        for i2 := 1 to length(database) do
        begin
          if Database[i2].Wort1 = wort1 then
          begin
            / ...
          end
          else
          begin
            Setlength(database, length(database) + 1);



Das Anhaengen eines neuen Eintrag (wenn nix gefunden), muss ausserhalb der Schleife stehen.

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: performanceproblem while schleife

Beitrag von Dragon »

@gocher
Sehe ich das richtig das bei deinem code die whileschleife dann entfällt

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: performanceproblem while schleife

Beitrag von gocher »

Wenn er es so abegändert hat wie ich es beschrieben habe steht es schon außerhalb der inneren Schleife!

Folgendes wäre auch eine Option, von wegen den ganzen Positionsermittlungen und so

Code: Alles auswählen

  sl := TStringList.Create;
  sl.Delimiter := ' '; // Leerzeichen als Wort Trenner
  sl.QuoteChar := #$0; // keine " als Maskierung
  sl.DelimitedText := Text;  // durch diese Zuordnung wird der Zugewiesene Text in einzelne Strings
  // (Worte in diesem Fall unterteilt)
  // dann kannst du dir alles ausschneiden ersparen
   t2 := length(Database);
  for i:=0 to sl.Count-3 do
  // die Schleife beginnt bei 0 (erstes Wort) und aus den letzten zwei Worten kannst Du keine
  // dreierkombinationen machen das würde zu Zugriffsverletzungen führen
  begin
    found := false;
    if t2>0 then
    begin
      for i2 := 0 to t2-1 do
      begin
        if (Database[i2].Wort1 = sl.strings[i]) and (Database[i2].Wort2 = sl.strings[i+1]) and (Database[i2].Folgewort = sl.strings[i+2]) then
        begin
          inc(Database[i2].Anzahl);
          found := true;
          break;
        end;
      end;
    end;
    if not found then
    begin
      Setlength(Database, t2 + 1);
      Database[t2].Wort1 := sl.strings[i];
      Database[t2].Wort2 := sl.strings[i+1];
      Database[t2].Folgewort := sl.strings[i+2];
      Database[t2].Anzahl := 1;
      t2 := length(Database);
    end;
  end;
  sl.Free;
Zuletzt geändert von gocher am So 15. Mai 2016, 16:25, insgesamt 6-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: performanceproblem while schleife

Beitrag von gocher »

Dragon hat geschrieben:@gocher
Sehe ich das richtig das bei deinem code die whileschleife dann entfällt


nein
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: performanceproblem while schleife

Beitrag von Dragon »

wieso rechnest du bei der stringliste in der schleife -3.
und kann man da überhaupt mit einer stringliste arbeiten ich meine muss dann jedes wort nicht in einer extra zeil vorliegen?

Edit1:
    Danke für die erweiterten kommentare
    habs so mal probiert das programm crasht dann aber mit "EStringListError: List index (416) out of bounds"
Zuletzt geändert von Dragon am So 15. Mai 2016, 16:07, insgesamt 2-mal geändert.

Antworten