AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TList Schneller updaten

Ein Thema von tromorow · begonnen am 19. Dez 2005 · letzter Beitrag vom 19. Dez 2005
Antwort Antwort
tromorow
(Gast)

n/a Beiträge
 
#1

TList Schneller updaten

  Alt 19. Dez 2005, 20:11
Hi Läutz,
ich versuch hier jetzt noch mal Hilfe zu bekommen.
Ich hab ein Programm geschrieben mit einer TList.
Jetzt muss ich die Liste öfters nummerieren,
was wenn die Liste voll ist eine weile braucht.
Könnt Ihr mir helfen meine Funktion zu tunen?
Anbei ein Programmausschnitt und ein Beispiel des Listeninhalts.

Danke!
Gruß TT

Delphi-Quellcode:
procedure TSDIAppForm.UpdateList;
var
  regexpr : TRegExpr;
  i, j : Integer;
begin
  regexpr := TRegExpr.Create;
  List.Items.BeginUpdate;

    try

      i := 0;
      j := ini.ReadInteger('Number','Start',0);
      while (i <= List.Count-1) do
      begin
        if stx.ReadBool('Replace','Number',ini.ReadBool('System','Number',true)) then
        begin
          regexpr.Expression := stx.ReadString('Replace','NumSignRegExp',
                                  ini.ReadString('Number','SignRegExp','(?i)^N(\d+)\s*(.*)'));
          if (i = 0) and (stx.ReadBool('Replace','ID',ini.ReadBool('System','ID',true))) then
          begin
            regexpr.Exec(List.Items[i]);
            if OpenFileID = 0 then
              List.Items[i] := SysFuncs.SearchAndReplace(
                                 SysFuncs.SearchAndReplace(
                                   regexpr.Replace(
                                     List.Items[i],
                                     stx.ReadString('Replace','IDSign',
                                       ini.ReadString('ID','Sign','N$#')),
                                     true
                                   ),
                                   '$s',
                                   ' '
                                 ),
                                 '$#',
                                 IntToStr(List.Count-1)
                               )
            else
              List.Items[i] := SysFuncs.SearchAndReplace(
                                 SysFuncs.SearchAndReplace(
                                   regexpr.Replace(
                                     List.Items[i],
                                     stx.ReadString('Replace','IDSign',
                                       ini.ReadString('ID','Sign','N$#')),
                                     true
                                   ),
                                   '$s',
                                   ' '
                                 ),
                                 '$#',
                                 IntToStr(OpenFileID)
                               );
          end
          else if not (List.Items[i] = '') then
          begin
            if regexpr.Exec(List.Items[i]) then
              List.Items[i] := SysFuncs.SearchAndReplace(
                                 SysFuncs.SearchAndReplace(
                                   regexpr.Replace(
                                     List.Items[i],
                                     stx.ReadString('Replace','NumSign',
                                       ini.ReadString('Number','Sign','N$#$s$2')),
                                     true
                                   ),
                                   '$s',
                                   ' '
                                 ),
                                 '$#',
                                 IntToStr(j)
                               )
            else
              List.Items[i] := SysFuncs.SearchAndReplace(
                                 SysFuncs.SearchAndReplace(
                                   SysFuncs.SearchAndReplace(
                                     stx.ReadString('Replace','NumSignIns',
                                       ini.ReadString('Number','SignIns','N$#$s$a')),
                                     '$a',
                                     List.Items[i]
                                   ),
                                   '$s',
                                   ' '
                                 ),
                                 '$#',
                                 IntToStr(j)
                               );
              //showmessage (List.Items[i]);
          end;
        end;
        List.Items[i] := CorrectLine(List.Items[i]);
        i := i + 1;
        j := j + ini.ReadInteger('Number','Width',1);
      end;

    finally
      regexpr.Free;
      end;

    if not (List.Items[List.Count-1] = '') then
      List.Items.Add('');

    List.Items.EndUpdate;
  end;
Code:
N568993 
N1 (***)
N2 G98 X-10 Y-10 Z-40 I320 J170 K50 
N3 G99 X0 Y0 Z0 I300 J150 K-30 
N4 F150 S1000 T5 M6 
N5 M13 
N6 G0 Z100 
N7 G0 X30 Y20 
N8 G0 Z2 
N9 (***)
N10 G89 Z-19 B1 R19 I50 J1 K5 
N11 G79 X30 Y20 Z0 
N12 G0 Z30 
N13 G0 X260 Y30 
N14 G0 Z2 
N15 (***)
N16 G89 Z-19 B1 R29 I50 J1 K5 
N17 G79 X260 Y30 Z0 
N18 G0 Z30 
N19 G0 X150 Y17 
N20 G0 Z2 
N21 (***)
N22 G87 X230 Y34 Z-19 B1 I50 J1 K5 
N23 G79 X150 Y17 Z0 
N24 G0 Z30 
N25 G0 X30 Y10 
N26 G0 Z2 
N27 (***)
N28 G87 X38 Y30 Z-19 B1 I50 J1 K5 
N29 G79 X30 Y5 Z0 
N30 G0 Z30 
N31 G0 X255 Y10 
N32 G0 Z2 
N33 (***)
N34 G87 X40 Y40 Z-19 B1 I50 J1 K5 
N35 G79 X254 Y10 Z0 
N36 G0 Z30 
...
N146 G0 Z100 
N147 M30
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: TList Schneller updaten

  Alt 19. Dez 2005, 20:40
Ich würde mal sagen, nicht die Stringliste ist das Langsame, sondern die die RegExpression.
Mess mal Zeiten:
1x so und 1x, in dem Du den regExpr-Teil auskommentierst. Dann siehst Do, wo der Haken ist.

Bei 150 Elementen liegt der Zugriff auf eine Stringliste im nichtmessbaren Bereich. Da Du die Liste auch nicht in ihrer Größe veränderst, tippe ich wirklich auf regExpr. Eventuell bringt es mehr, die regExpr auf die Items.Text loszulassen...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
tromorow
(Gast)

n/a Beiträge
 
#3

Re: TList Schneller updaten

  Alt 19. Dez 2005, 22:23
Also ich hab jetzt mal alle Regularexpressions auskommentiert
und beide male die Zeit gemessen.
Meiner Rechnung nach macht die Regularexpressions eine Verlängerung von 13% aus!
Also eigentlich so gut wie nichts!
Des SearchAndReplace macht ca. 5% aus und des lesen aus den ini Dateien macht a bisele mehr als 23% aus. D.h. da könnt ich 23% sparen!
Ähm wie schaut des eigentlich aus wenn ich ne ini auf nem Server ligen hab dann ich die Schleife noch viel langsamer!
Kann des sein dass des die ini Datei bei jedem Read neu ausliest!??
So kommt’s mir zumindest mal vor!?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TList Schneller updaten

  Alt 19. Dez 2005, 22:25
Hast du etwa TIniFile verwendet? Versuche es mal mit TMemIniFile.

Grüße vom marabu
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: TList Schneller updaten

  Alt 19. Dez 2005, 22:35
Siehst Du, das hab ich doch glatt übersehen, lies am besten gleich alle Werte der Ini-Datei *vor* der Schleife aus und pack sie in lokale Variablen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
tromorow
(Gast)

n/a Beiträge
 
#6

Re: TList Schneller updaten

  Alt 19. Dez 2005, 23:13
Ahmm, des kann’s irgend wie net sein!
Jetzt hab ich entdeckt dass in CorrectLine noch einige ini Funktionen ausgeführt werden.
Die hab ich jetzt raus gemacht und jetzt rennts scho um 40% schneller!
Aber trotzdem noch a bissel langsam!
  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 03:16 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