![]() |
Delphi-Version: 5
Stringfunktionen
Gibt es irgendwo eine Sammlung erweiterter Stringfunktionen?
Hintergrund: Mit D5 habe ich nicht einmal StrUtils, wobei ich auch nicht weiß, ob dort etwas enthalten ist, was D5 nicht anderweitig kennt, außer vielleicht PosEx. Worum es mir aber geht sind erweiterte/spezielle Stringfunktionen die nicht zum Standardrepertoire von Delphi gehören (zumindest in D5 noch nicht). Zum Beispiel eine Explode Funktion/Prozedur: ![]() oder die Anzahl eines Zeichens in einem String ermitteln. Bei einer Suche im Internet finde ich bei diversen Schlagwörtern nur ein Hinweis auf die Length Funktion die mir ja die Anzahl aller Zeichen ausgibt, das aber nicht das ist was ich suche. Oder aber die Ermittlung eines Zeichens in einem String, was ja Pos macht, aber das ist auch nicht das was ich benötige. Ja, ich kann/könnte es selbst programmieren, aber 1. Wird meine Variante nicht unbedingt die schnellste sein, da ich kein Profi Entwickler bin 2. Gibt es mit Sicherheit schon mehrere Implementationen, auch wenn die vielleicht erst auf der Googlesuchseite 10 steht. 3. Weiß ich dann immer noch nicht, welche die Schnellste ist. Nicht nur in dem Bereich wäre also eine Sammlung interessant die mehrere Lösungen präsentiert und dies vielleicht sogar mit Performenzangaben je nach Verwendungszweck. Wie dem auch sei. Für den aktuellen Zweck habe ich etwas gefunden: ![]() Auch wenn die zweite Antwort Nonsens ist, weil die Frage nicht verstanden wurde, bzw. hier: ![]() muss nur mal sehen welche die bessere Variante ist. Wenn jemand also eine Sammlung von Stringfunktionen kennt, das wäre super. Gruß relocate PS: Vor dem Posten bitte auch prüfen, ob der Link aus den Favoriten noch aktuell ist. Habe Links auf Stringfunktionen gefunden, leider waren die nicht mehr Online. |
AW: Stringfunktionen
Explode: Such mal hier im Forum.
Ansonsten: Viele Programmierer in diesem Forum freuen sich, dir die schnellste Routine frei Haus zu liefern. Und etwas dazulernen kannst du auch. Aber: Du musst immer eine Lösung vorweisen, die andere verbessern sollen, denn sonst denkt man, Du lässt andere für dich arbeiten. Das kommt nicht gut an. Also: Ran ans Werk! |
AW: Stringfunktionen
![]() |
AW: Stringfunktionen
Na gut, was zum anfixen:
![]() Eigentlich von ![]() |
AW: Stringfunktionen
@Iwo Asnet
Ein Hinweis für unerfahrene 2009+ Anwender, sollte noch gegeben werden |
AW: Stringfunktionen
Zitat:
Also. Ich bin jemand, der gerne alles selbst entwickelt und finde es ätzend, wenn immer auf irgendwelche Komponenten verwiesen werden. Mit der Programmierung habe ich unter TP 6 angefangen, eigentlich TP3 aber TP6 gab es schon, die Schule war nur noch nicht auf dem neuesten Stand. Folglich musste man so ziemlich alles selbst entwickeln. Dann habe ich eine andere Richtung eingeschlagen und bin was das Programmieren angeht nach einer Pause beim Hobby geblieben. Da aber solche grundlegenden Routinen (auch wenn ich sie als "erweiterte" Funktionen bezeichnet habe), ist es keine Superduperkomponente nach der ich gefragt habe, die sich als Eierlegendewollmichsau entpuppt, noch habe ich verlangt, die Lösung hier auf dem silbernen Tablett zu bekommen, und diese Routinen zu Hauf im Netz zu finden sind und man nicht wirklich immer wieder das Rad (das Rad, nicht das Auto) neu entwickeln muss, so habe ich nur gefragt, ob jemand eine Sammlung kennt, da die Suche zeitraubend ist und für solche Basisaufgaben eine Sammlung echt super wäre. Explode war nur ein Beispiel und meine eigentliche Suche nach Counterfunktion war schon von Erfolg gekrönt. Zitat:
Außerdem bin ich gerne bereit meinen Beitrag für eine solche Sammlung zu leisten, ich habe z.B. eine Delimiter Funktion entwickelt, die ich bislang nicht finden konnte, auch wenn es sie geben mag, aber ich will sich eben nicht irgendwo posten wo sie einsam und verloren untergeht, sondern gerne in eine Sammlung mit vielen anderen Stringfunktionen. |
AW: Stringfunktionen
Zitat:
![]() Explode war ja nicht wirklich meine Suche, aber selbst das würde ich nicht als Highlevel bezeichnen. Luckie hat so etwas in seinen Snippets: ![]() Danke. |
AW: Stringfunktionen
Zitat:
//No copying, alteration, or use is permitted without //prior permission from myself. Dann darf man das wohl kaum verwenden. |
AW: Stringfunktionen
EDIT:\\ Doppelpost, wenn der Browser mal wieder hängt.
|
AW: Stringfunktionen
![]() Eigene Beiträge sind vermutlich ab einer bestimmten Qualität sicher machbar. Siehe auch ![]() |
AW: Stringfunktionen
Zitat:
|
AW: Stringfunktionen
Die
![]() Ich verwende unter D5 noch die Version 1.0.4, weil ich mit den (damals) neuen 2.0x Versionen Probleme hatte. Auf jeden Fall erhälst du mit der JCL ein volles Paket an Units mit vielen nützlichen Funktionen. Dein Programm wird dabei kaum grösser, weil der Linker nur die Funktionen dazulinkt, die du auch benützt hast. |
AW: Stringfunktionen
Zitat:
|
AW: Stringfunktionen
Zitat:
|
AW: Stringfunktionen
Zitat:
Denn es kommt auf den Einsatzzweck drauf an. - wird es sehr oft aufgerufen, dann könnte es schon wichtig sein - ist die zeit egal, dann ist auch die Geschwindigkeit egal (bzw. es muß nicht unbedingt das Allerschnellste sein) - und manchmal reicht es, wenn es ausreichend flott ist, aber man dafür wartbaren code bekommt, welchen man eventuell auch noch selber versteht. Ansonsten kannst du ja immernoch nachmessen, bzw. etwas nehmen, was dir vom Code her gefällt und sollte es doch noch geschwindigkeitsprobleme geben, dann könnte man immer noch nachsehn was schneller/optimaler ist. Wie es schon erwähnt wurde: Wenn es um einzelne Funktionen geht, dann bieten die Forensuche, die CL, sowie Google und die anderen Delphi-Webseiten sehr viel. Und notfalls fragt man eben hier geziehlt nach. |
AW: Stringfunktionen
Zunächst muss eine Routine zuverlässig funktionieren, danach kann man dann sehen, wie man die Geschwindigkeit ggf. erhöhen könnte. Dreht man diese Reihenfolge um, kommt selten etwas Brauchbares dabei heraus.
Zitat:
|
AW: Stringfunktionen
Zitat:
"Nicht nur in dem Bereich wäre also eine Sammlung interessant die mehrere Lösungen präsentiert und dies vielleicht sogar mit Performenzangaben je nach Verwendungszweck." Zitat:
Zitat:
|
AW: Stringfunktionen
Zitat:
Ich habe mal ein Char aus einem String herausgelöst. Was bei einem Leerstring eine Exception wirft, also muss das getestet werden. Ich habe das mit folgenden Varianten gemacht: 1)
Delphi-Quellcode:
2)
if wort = '' then chrtest := #0
else chrtest := wort[1];
Delphi-Quellcode:
3)
if wort <> '' then chrtest := wort[1]
else chrtest := #0;
Delphi-Quellcode:
4)
if length(wort)=0 then chrtest := #0
else chrtest := wort[1];
Delphi-Quellcode:
5)
if length(wort)>0 then chrtest := wort[1]
else chrtest := #0;
Delphi-Quellcode:
Auf meinem PC war die Variante 2 die schnellste, wenn auch nur unwesentlich schneller als 1.
try
chrTest := wort[1]; except chrTest := #0; end; Variante 4 hat ungefähr doppelt solange gedauert, wiederum unwesentlich schneller als 3. Der Try Block etwas langsamer noch als 3/4 (außer die Exception wurde geworfen, das hat gedauert). Wenn der Fall eintrat dass der String leer war erhöhte sich die Abarbeitungszeit. Auf einem anderen, älteren PC war das anders. Die Variante 1 und 2 wurden deutlich schneller bei einem Leerstring. Und die Varianten 3 und 4 etwas schneller. Also ist auch noch relevant wie man testet und welcher der Ziel PC ist. Der Try Block war auch da langsamer bei einer Exception. |
AW: Stringfunktionen
Zitat:
Denn fang jetzt mal an dein Programm zu debuggen, wenn da genügend solcher Code drin vorkommt, dann kannst'e dich auch gleich erschießen, denn sowas macht absolut keinen Spaß mehr. Im Fall von Zahlen ist das sehr gut beobachtbar:
Delphi-Quellcode:
try
i := StrToInt(s); except i := 0; end; // oder i := StrToIntDef(s, 0);
Delphi-Quellcode:
Vorallem leere except-end-Blöcke sind grauenhaft.
try
i := StrToInt(s); {mach was mit i} except end; // oder if TryStrToInt(s, i) then {mach was mit i} Bezüglich der Unterschiede zwischen = und <>. Dort hängt es sehr von den Eingangsdaten ab. Da ist mir persönlich fast immer alles egal und ich verwende die Variante, welche ich besser lesen kann. Außerdem versuche ich durchgängig nur eine Variante zu verwenden, weil man den gesamten Code dadurch auch besser verstechen kann. (man verliest sich weniger) |
AW: Stringfunktionen
Zitat:
Zitat:
Zitat:
|
AW: Stringfunktionen
Delphi-Quellcode:
und
s <> ''
Delphi-Quellcode:
prüft theoretisch auf die globale Konstante eines Leerstrings ''.
s = ''
Da ein Leerstring aber einem nil entspricht, ergibt das somit eine Prüfung auf nil, bzw. 0. Das Length ist eine Funktion und die will erstmal aufgerufen werden, also Sprung (JMP) + Rücksprung (RET), dazu noch eine IF-Abfrage und bis zu zwei ausgelesene Werte (der interne Pointer und die Längenangabe). Erst danach kommt dann deine
Delphi-Quellcode:
-Prüfung dran.
=0
Try selber ist schon OK und vorallem mit Try-Finally sollte man seinen Speicher besser mal sauber halten (Resourcenschutzblöcke). Auch das Try-Except hat etwas Gutes an sich, aber man sollte es auch ordentlich einsetzen, aber insbesondere nicht zur Ablaufsteuerung. Eine Exception Ausnahme sollte eine Ausnahme bleiben und nicht grob fahrlässig im Übermaß missbraucht werden. |
AW: Stringfunktionen
Zitat:
|
AW: Stringfunktionen
Zitat:
Vielleicht kannst Du das erhellen. Was ich bei dem Try-Finally manchmal nicht verstehe. Beim erzeugen von Objekten soll es ja genutzt werden und im Finally steht dann die Freigabe des Objekts. Doch es soll ja mit dem Objekt gearbeitet werden und später irgendwann mal freigegeben werden, was nutzt da zu Beginn des Objektlebens ein Finally? Mit dem Nichteinsetzen zur Ablaufsteuerung gehe ich voll konform. |
AW: Stringfunktionen
Wobei Assembler nicht die eierlegende Wollmilchsau ist, wofür man sie oftmals hält.
Ich hatte persönlich auch schon den Fall, daß ich mit Assembler absolut nichts optimieren konnte. Es war nahezu genauso schnell, wie ein ordentlicher Pascal-Code und die Codeoptimierung des Compilers. Abgesehn davon, daß man dem Assembler-Code nicht mehr ansehn konnte, was er eigentlich macht. (ohne tausende Kommentare) Selbst wenn es ein bissl schneller sein währe, sollte man oftmals wirklich mehr an einen einfach und wartbaren Code denken. Und jetzt vorallem auch noch in Bezug auf Multiplattform, denn der Pascalcode kann leichter an andere Systeme angepaßt werden, falls er es sowieso nicht schon ist. Oftmals werden Objekte und andere Resourcen nur für eine gewisse Dauer benutzt. z.B. der Zugriff auf eine Datei. Da sollte das Dateiobjekt und vorallem das interne Handle am Ende unbedingt freigegeben werden. Genauso ein Speicherblock (GetMem), welcher benutzt und sicher freigegeben werden sollte, selbst wenn mal etwas nicht so läuft, wie es soll. Wenn das öfters passiert, dann können einem ganz schnell die Resourcen ausgehn, bzw. die Datei ist beim nächsten Man nicht mehr zugänglich, da sie ja immernoch gesperrt ist. |
AW: Stringfunktionen
Ach, na sicher. Inzwischen sind die Compiler so ausgefeilt, dass eine Optimierung in Assembler oftmals kaum noch Sinn macht. Und auch die Portabilität spielt eine große Rolle, wobei das für Delphi bislang eher nebensächlich war. Es wird auch inzwischen nicht einfacher, da sogar der Prozessor versucht den Programmlauf zu optimieren und dabei ggf. anders agiert, als der Entwickler das vorgesehen hat, je nach Prozessortyp.
Das erhellt in der Tat etwas und macht wirklich Sinn. War das unter TP noch einfach als man quasi den ganzen Rechner für sich hatte. Vielen Dank. |
AW: Stringfunktionen
Nja, in dem Fall war halt der Pascal-Code schon sehr gut.
Wobei ich auch erst dachte da noch was rauszuholen. Nur 3 Tage später übermannte mich dann die Ernüchterung, als es ans Testen des Assemblercodes ging. 3 Tage Arbeit, für nichtmal 100 Millisekunden Zeitersparnis, bei einer Gesamtlaufzeit von knapp 30 Sekunden ... das war's absolut nicht Wert. Es gibt auch Intelligenzbestien, welche mit Multithreading (das ist auch oftmals überbewertet) Dateioperationen optimieren wollen, mit dem Ergebnis, daß die Singlethreadanwendung schneller war, da sich die Threads gegenseitig ausbremsten. Bei HDDs ... SSDs haben ja nicht solche Laufzeitprobleme, wenn der Schreib-/Lesekopf ständig umpositioniert werden muß. :stupid: Gute SSDs unterstützen manchmal sogar einen paralellen Zugriff, womit Multithread dann doch Vorteile bringen könnte, aber wieviele SSDs gibt's denn ... im Durchschnitt also mehr Nachteil, es sei denn man baut beide Varianten ein, was auch nichts bringt, da sich SSDs aktuell noch nicht sicher erkennen lassen. |
AW: Stringfunktionen
Das kann man dann unter der Rubrik Erfahrung ablegen.
Das kann ich mir vorstellen, das liegt wirklich in keinem Verhältnis. Wenn der Assemblercode sehr komplex ist, ist es halt schwierig abzuschätzen wie weit die Optimierung klappen würde. Unter DOS war es ja Volkssport jedes Quentchen Zeit aus dem System zu holen, da es ja insgesamt alles sehr langsam war. Aber irgendwann war halt Schluss. Hm, ja, da kann man das System sehr schnell ausbremsen, so viel zum Thema Verwendungszweck. Wenn man da nicht weiß, wie die Hardware funktioniert dann hilft auch nichts mehr. Ist die Frage ob es soviel Geschwindigkeitszuwachs gibt, wenn der nächste Zugriff ebenfalls schnell geht. Dann kann man sich den Multithreadaufwand sicher sparen. So langsam wird der Thread zum Optimierungsthema. |
AW: Stringfunktionen
Zitat:
Das fängt mit NonVCL an. (siehe die Beiträge im Forum und unzähligen Beispiele auf Luckies Webseite ![]() Dort verzichtet man auf große vorgefertigte Bibliotheken (vorallem die VCL) und macht nahezu alles selber. Oder schau dir Mal die ![]() Man versucht möglichst viel in möglichst wenig reinzubekommen. z.B. kkrieger ( ![]() ![]() ![]() ![]() ![]() ![]() ![]() ... |
AW: Stringfunktionen
Klar gibt es das heute noch, aber früher war es ja fast schon zwingend.
(DOS Speichergrenze, PCs im MHz Bereich statt GHz-Wahnsinn, manchmal habe ich das Gefühl die PCs von heute sind da nicht schneller, ich weiß, heute passiert auch viel mehr auf den Maschinen unter Windows, aber viele Programme sind rausgeschleudert, nach dem Motto Hauptsache geht, wie ist egal.) Natürlich war da auch die Demoszene Vorreiter. NonVCL entwickle ich zum Teil auch. Bin aus der Admin-Schiene und um meine Arbeit zu erleichtern schreibe ich mir das ein oder andere Tool. Damit es schneller geht oft erst VCL aber die Größe der EXE Dateien schreckt mich oft ab und dann fange ich an zu optimieren, wenn das Tool öfter zum Einsatz kommt. KKrieger kenne ich, das Ding hat mein Laptop auf dem Gewissen. (Nein, nicht wirklich, aber beim Abspielen ist er fast den Hitzetod gestorben). Farbrausch kenne ich daher auch. Das kannte ich noch nicht. Dass es da noch mehr Reserven gibt mit dem Austausch der System Unit, cool. Nochmals, vielen Dank. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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