Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FastStrings eingestellt? (https://www.delphipraxis.net/132318-faststrings-eingestellt.html)

PeterPanino 10. Apr 2009 00:00


FastStrings eingestellt?
 
Hallo, weiß jemand, ob es eine neuere Version von FastStrings gibt?. Die letzte Version scheint nämlich die Version 3.2 aus dem Jahr 2003 zu sein. Außerdem ist unter der angebenen URL http://www.droopyeyes.com/default.as...howProductID=4 nur mehr eine Optiker-Website zu erreichen.

Ich habe nämlich eine Routine, in der StringReplace häufig aufgerufen wird, und muss deshalb die Ausführzeit optimieren. Kann hier jemand dazu einen Rat geben?

himitsu 10. Apr 2009 00:12

Re: FastStrings eingestellt?
 
viele der Funktionen des Projektes sind auch schon direkt in Delphi integriert.

in "neueren" (ich weiß nicht genau seitwann) Delphiversionen sind viele "langsame" Funktionen direkt durch welche von da ersetzt wurden.

eventuell ist das auch ein Grund, daß man es als Einzelprojekt aufgegeben hat? :gruebel:

jaenicke 10. Apr 2009 00:14

Re: FastStrings eingestellt?
 
Vielleicht könntest du das auch anders umsetzen als mit StringReplace, denn das ist zwar einfach, aber nicht besonders schnell. Du könntest zeichenweise durchgehen und schauen ob es Übereinstimmungen gibt, wenn du nach mehreren Strings suchst.

Und vielleicht gibt es auch noch eine bessere noch speziellere Lösung, je nachdem was du genau vor hast.

API 10. Apr 2009 00:14

Re: FastStrings eingestellt?
 
Peter Morris, Author des FastStrings Projekts, hat dieses eingestellt.
Hintergruende sind in diesem Blog zu lesen.

PeterPanino 10. Apr 2009 00:57

Re: FastStrings eingestellt?
 
Zitat:

Zitat von jaenicke
Du könntest zeichenweise durchgehen und schauen ob es Übereinstimmungen gibt, wenn du nach mehreren Strings suchst

Gibt es Studien darüber, ob dieser Algorithmus effizienter ist?

jaenicke 10. Apr 2009 01:04

Re: FastStrings eingestellt?
 
Naja, eigentlich sollte es vom Algorithmus her schneller sein, aber es kommt drauf an, ob man die Umsetzung schneller hinbekommt als der bestehende Code für Such- und Ersetzoperationen, denn das erfordert ja auch Speicherzugriffe. :gruebel:

PeterPanino 10. Apr 2009 01:26

Re: FastStrings eingestellt?
 
Naja, was ich machen möchte, ist eine StringListe nach HTML zu übersetzen, d.h. z.B. die deutschen Umlaute sollen in die entsprechenden HTML-Äquivalente übersetzt werden. Ober gibt es dafür schon fertige Routinen?

jaenicke 10. Apr 2009 01:59

Re: FastStrings eingestellt?
 
Das nicht, aber da du jeweils einen Buchstaben durch mehrere andere ersetzen willst, ist das zeichenweise durchgehen mit absoluter Sicherheit sehr sehr viel schneller. Die Ersetzungen kannst du ja in einem Array speichern und dann bei dem entsprechenden Zeichen nur darauf zugreifen.

Sinnvoll dürfte es sein einen neuen größeren String zu erstellen und die Zeichen zeichenweise hineinzusetzen, dann wird nicht jedesmal bei einer Ersetzung der komplette String kopiert.

Eine Idee könnte dir dieser Code geben, der ebenfalls eine Ersetzung durchführt:
http://www.delphi-forum.de/viewtopic...=535934#535934
Mit dem Code habe ich viele Millionen Buchstaben pro Sekunde abarbeiten können (ich glaube 150 Millionen oder so).

Wie sieht dein Code denn aus? Sind da visuelle Komponenten involviert? Das könnte die größten Geschwindigkeitsprobleme verursachen, wenn man da nicht aufpasst.

Namenloser 10. Apr 2009 02:20

Re: FastStrings eingestellt?
 
Also einen optimierten Code, um mehrere Patterns auf einmal zu ersetzen habe ich hier auf jeden Fall schon gesehen.
Über Google habe ich den hier gefunden, ich hoffe, das ist der richtige.

jaenicke 10. Apr 2009 02:23

Re: FastStrings eingestellt?
 
Ja, den meinte ich, aber in diesem Fall geht es noch sehr viel schneller, da es um einzelne zu ersetzende Zeichen geht, die man vorher in einem Array optimal speichern kann, so dass nur wenige einfache Operationen jeweils notwendig sind.

PeterPanino 10. Apr 2009 03:34

Re: FastStrings eingestellt?
 
Vielen Dank für die vielen Hinweise! Ich werde das alles mal ausprobieren und dann hier Bescheid geben, wer das Rennen gemacht hat ... ;-)

alzaimar 10. Apr 2009 07:55

Re: FastStrings eingestellt?
 
HTML-Äquivalente bestehen aber aus mehr als einem Zeichen ('&' etc. wenn ich mich nicht irre).

Trotzdem wird eine Lookup-Tabelle für die zu ersetzenden Zeichen etwas bringen. Ich habe selbst mit einem simplen Case-Konstrukt eine ausreichende Performance erzielt.

jaenicke 10. Apr 2009 07:57

Re: FastStrings eingestellt?
 
Es geht um das Ersetzen eines Umlautes in die HTML-Repräsentation, deshalb kann man das sehr gut zeichenweise machen, praktisch so wie ich es beim Adventsgewinnspiel gemacht hatte.

Für den Ersetzungsstring bietet sich ein konstantes Array an, das die HTML-Ersetzungen entsprechend des Ascii-Codes enthält. Dann ist das ganze sehr einfach und schnell.

alzaimar 10. Apr 2009 08:12

Re: FastStrings eingestellt?
 
Zitat:

Zitat von jaenicke
Es geht um das Ersetzen eines Umlautes in die HTML-Repräsentation

Gib mal ein Beispiel. Ich kann mir das nicht vorstellen, was wie ersetzt werden könnte (War spät gestern).

jaenicke 10. Apr 2009 08:19

Re: FastStrings eingestellt?
 
Delphi-Quellcode:
const
  HtmlCodes: array[0..3] of String = ('ä', 'å', 'æ', 'ç');
// Das ä hat den Zeichencode $E4, also ist das die unterste Grenze beim Ersetzen

if (DerString[i] >= Chr($E4)) and (HtmlCodes[Ord(DerString) - $E4] <> '') then
  // Zeichen i durch HtmlCodes[Ord(DerString) - $E4] ersetzen
Das kann man natürlich effizienter umsetzen, z.B. indem alle Zeichen in das Array gelegt werden und daher weniger Abfragen nötig sind.

Eine schnelle Möglichkeit einer ähnlichen Vorgehensweise habe ich ja verlinkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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 by Thomas Breitkreuz