![]() |
TList Schneller updaten
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 |
Re: TList Schneller updaten
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... |
Re: TList Schneller updaten
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!? |
Re: TList Schneller updaten
Hast du etwa TIniFile verwendet? Versuche es mal mit TMemIniFile.
Grüße vom marabu |
Re: TList Schneller updaten
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.
|
Re: TList Schneller updaten
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! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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