AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [Optimiert] Explode Prozedur - Reloaded (Ersatz für CodeLib)

[Optimiert] Explode Prozedur - Reloaded (Ersatz für CodeLib)

Ein Thema von alzaimar · begonnen am 9. Dez 2006 · letzter Beitrag vom 17. Aug 2010
Antwort Antwort
Seite 2 von 8     12 34     Letzte » 
alzaimar
Registriert seit: 6. Mai 2005
Hi!
Ich hab mir mal die Mühe gemacht, und eine alternative Explode-Funktion implementiert, die wohl doch etwas schneller ist, als die hier in der Code-Library hinterlegte Version.

Ich möchte Euch bitten, den Code zu testen und auch zu optimieren. Wenn wir damit durch sind, sollte diese Version in die Code-Library übernommen werden, bzw die jetzige Version ersetzen.

Details über die Herleitung (na ja, Recherche und Kopieren ) steht im Code.

[Edit] Unten genannte Tests sowie Zeitmessung eingearbeitet: Es ist ein komplettes Projekt mit Funktions- und Speed-Test. Bitte versucht, Teile davon zu optimieren (ASM, Pointer arithmetic etc.). [/edit]

History:
12.12. Version 1.1: Erste schwere Fehler ausgebaut: Strings am Ende wurden falsch bzw. gar nicht erkannt.
13.12. Version 1.2: Kleiner Fehler in der Prepare-Methode: (Hilfsvariable als Cardinal deklariert, bei Zuweisung <0 ignoriert), Facelifting auf Anregung von Elvis (Feld- und Variablennomenklatur). Ferner ist eine Test-Iterator-Basisklasse sowie ein Iterator für Char-Delimiter (z.B. für CSV) implementiert.
14.12 Version 1.3: Iterator für QS-Search implementier. Die Test-Routine wurde um Zeitmessungen für den Iterator sowie die Code-Library ergänzt.
23.12.07 Version 1.4: Beseitigt seltenen Bereichsüberlauf am Ende eines Strings.

Diese Version ist zwischen 4 und 1000x schneller als die Version aus der Code-Library.
Angehängte Dateien
Dateityp: zip stringdivider_195.zip (219,6 KB, 958x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
 
API
 
#11
  Alt 13. Dez 2006, 04:33
Version 1.1 enthält einen Bug in TStringDivider.Prepare

Falls Length(fPattern)= 1 ist erbigt fPatternLength2 = -1 was zu einem "Integer overflow" führt,
da fPatternLength2 als Cardinal deklariert ist.

Bugfix: Überprüfen, ob fPattern > 1
Delphi-Quellcode:
  If length(fPattern) > 1 Then
    fPatternLength2 := fPatternLength - 2;


Delphi-Quellcode:
Procedure TStringDivider.Prepare;
//..
Begin
  fPatternLength := Length(fPattern);
  fPatternLength1 := fPatternLength - 1;
  fPatternLength2 := fPatternLength - 2;
  cPatternFirstChar := fPattern[1];
  cPatternLastChar := fPattern[fPatternLength];
  pPattern := @fPattern[2];
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#12
  Alt 13. Dez 2006, 07:44
API: Dieser Fehler ist zwar irrelevant, aber ein Bug ist ein Bug, und nun isser weg. Neue Version ist im ersten Post.

Elvis: Die Sache mit den finals wusste ich nicht. Mal sehen, was das bringt. Zur potentiellen ASM-Optimierung: Da es sich um eine Art 'Pos' auf Char-Ebene handelt, könnte ich mir schon vorstellen, das man hier etwas drehen könnte. Leider hab ich von Intel-ASM keinen Schimmer.

Hier gibt es die FastStrings-Toolsammlung, die Stringfunktionen in ASM implementiert, vielleicht kann man sich hier etwas abkupfern.
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#13
  Alt 13. Dez 2006, 21:39
Soo, nächste Version oben reingestellt.
  Mit Zitat antworten Zitat
mimi

 
FreePascal / Lazarus
 
#14
  Alt 18. Jul 2007, 18:32
sag mal ist die Funktion jetzt Fertig ?
Würde sie gerne in meinem Lazarus Projekt unter Linux einsetzten.
(So Fern das geht).

kann die Funktion dann auch mit sowas umgehen:
testStr:='Hallo "Dies ist ein Text" hallo2'
Wenn ich jetzt z.b. hallo2 aufspielten wollte müsste ich ja vohrer alle Leerzeichen zählen.
Und nicht einfach sagen 1 weil nach dem ersten index würde ja jetzt hallo2 kommen.
Wegen den "".
Michael Springwald
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#15
  Alt 18. Jul 2007, 21:27
Ich denke, das die Klasse funktionsfähig ist. Ich verstehe nur nicht genau, was Du mit deinem Beispiel meinst.
  Mit Zitat antworten Zitat
mimi

 
FreePascal / Lazarus
 
#16
  Alt 18. Jul 2007, 21:57
Ich habe jetzt folgenden String:

Hallo1 "Test1 Test2 Test3" Hallo2 Hallo3

Hallo1 ist jetzt der erste Index
"Test1 Test2 Test3" ist jetzt der zweite Index
Hallo2 ist der Dritte Index.
Hallo3 ist der Vierte Index.

sowas meinte .
Michael Springwald
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#17
  Alt 19. Jul 2007, 09:49
Dazu ist diese Explode-Funktion nicht gedacht.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

 
Delphi 2010 Professional
 
#18
  Alt 19. Jul 2007, 11:14
@mimi: Das solltest du mit einer Stringlist lösen können.

Delphi-Quellcode:
var sl : TStringlist;
begin
  sl := TStringlist.Create();
  try
    sl.Delimiter := #32;
    sl.DelimitedText := 'Hallo1 "Test1 Test2 Test3" Hallo2 Hallo3';
    // sl[0] ist jetzt Hallo1
    //sl[1] ist Test1 Test2 Test3
    //sl[2] ist Hallo2
    //sl[3] ist Hallo3
  finally
    FreeAndNil(sl);
  end;
end;
Der Code ist aber ungetestet!
Thomas
  Mit Zitat antworten Zitat
C.Schoch

 
Turbo Delphi für Win32
 
#19
  Alt 23. Dez 2007, 11:56
Hi,
Ich hab gerade bei der einen Fehler in der Procedure QSExplode endeckt,
und zwar kommt es manchmal zu einem "Fehler bei Bereichsprüfung"

Delphi-Quellcode:
Procedure TStringDivider.QSExplode(Const aText: String; aItems: TStrings);
// ...
  While i <= k Do Begin
    If (fPatternFirstChar = aText[i]) And (fPatternLastChar = aText[i + fPatternLength1]) Then
      If (fPatternLength < 3) Or CompareMem(@aText[i + 1],fPatternPtr,fPatternLength2) Then Begin
        aItems.Add(Copy(aText,iTextStart,i - iTextStart));
        inc(i,fPatternLength);
        iTextStart := i;
        Continue;
      End;
    inc(i,fSkip[aText[i + fPatternLength]]); //<-- Hier Tritt der Fehler auf
  End;
// ...
Ich hab mal ein Beispielprojekt gemacht den Fehler zu veranschaulichen.
Angehängte Dateien
Dateityp: rar explodetest_169.rar (3,5 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#20
  Alt 23. Dez 2007, 13:37
Hallo, das Problem ist bekannt und beseitigt. Ich lade mal die aktuelle Version hoch. Nebenbei tritt der Fehler nicht auf, wenn Du die Bereichsprüfung ausschaltest. Korrekt ist das aber nicht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:52 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