![]() |
Wie kann man diesen Code optimieren
Ich habe ein Tool geschrieben, das viele Sätze miteinander vergleicht. Nun habe ich festgestellt, dass einige Sätze gleich sind, sich aber in Sonderzeichen unterscheiden. Also habe ich eine Routine hinzugefügt, die die Sätze ohne Sonderzeichen vergleicht. Dazu werden alle Sonderzeichen aus dem Satz entfernt. So wird zB aus: "US-Zölle: So zensiert China kritische Online-Beiträge" der Text "USZölleSozensiertChinakritischeOnlineBeiträge". Die Trefferquote ist höher. Aber auch die Suchdauer erhöht sich. So wurde aus einer Suche ohne die Routine in 7 Sekunden, eine Suche in 30 Sekunden, mit der Routine. Die Dauer hat sich also vervierfacht. Es ist auch sehr viel Text das verglichen wird.
Gibt es etwas, was alles schneller entfernt? Die Routine die ich hinzugefügt habe ist die (aufgerufen wird die CleanUpText2 Funktion):
Delphi-Quellcode:
//Funktion entfernt Zeichen. Macht zB aus "Ab Cd Ef" den Text "AbCdEf"
function RemoveChars(S: String; C: Char): String; begin Result := S; // Zeichen entfernen, zB Leerzeichen while Pos(C, Result) > 0 do Delete(Result, Pos(C, Result), 1); end; //Entfernt bestimmte Zeichen aus dem Text function CleanUpText(S: String): String; begin Result := S; Result := RemoveChars(S, ' '); Result := RemoveChars(S, '-'); //Bindestrich Result := RemoveChars(S, Chr(151)); //Geviertstrich Result := RemoveChars(S, '_'); Result := RemoveChars(S, ':'); Result := RemoveChars(S, ';'); Result := RemoveChars(S, ','); Result := RemoveChars(S, '.'); Result := RemoveChars(S, '!'); Result := RemoveChars(S, ''''); //Das ' Zeichen end; function CleanUpText2(S: String): String; begin Result := CleanUpTitle(S); end; |
AW: Wie kann man diesen Code optimieren
Ich habe es einfach mal an die KI weitergegeben. Ergebnis:
Delphi-Quellcode:
function CleanUpText(const S: String): String;
const CharsToRemove: set of Char = [' ', '-', Chr(151), '_', ':', ';', ',', '.', '!', '''']; var I, J: Integer; begin SetLength(Result, Length(S)); J := 1; for I := 1 to Length(S) do if not (S[I] in CharsToRemove) then begin Result[J] := S[I]; Inc(J); end; SetLength(Result, J - 1); end; |
AW: Wie kann man diesen Code optimieren
Zuerst würd' ich den Text in reine Kleinbuchstaben umwandeln, damit nicht über Unterschiede in der Groß-Kleinschreibung gestolpert wird.
Danach in einer Schleife die Zeichenfolge durchgehen, nur als Pseudocode:
Delphi-Quellcode:
Bringt das was?
function CleanUpText(sInput : Strng) : String;
var i : Integer; begin Result := ''; for i := 1 to Length(sInput) do begin case sInput[i] of 'a'..'z' : Result := Result + sInput[i]; 'A'..'Z' : Result := Result + LowerCase(sInput[i]); // Sind Umlaute relevant? 'Ä','ä' : Result := Result + 'a'; // das a ist Absicht, wegen z. B. Flughafen und Flughäfen 'Ö','ö' : Result := Result + 'o'; 'Ü','ü' : Result := Result + 'u'; 'ß' : Result := Result + 'ss'; end; end; |
AW: Wie kann man diesen Code optimieren
@Jasocul
Wo bleibt da bei der KI Optimierung noch der Spaß am programmieren :? Vielen Dank, das funktioniert tatsächlich. Statt 30 braucht er nur noch 9 Sekunden. Im Gegensatz zu 7 Sekunden ohne eine zusätzliche Routine. Ich habe mich bisher nicht mit der KI auseinandergesetzt, da ich das für eine Spielerei hielt, und der Meinung war, dass die sowas komplexes nicht hin bekommt. Nun bin ich eines besseren belehrt. Welche KI hast du genutzt? Ich habe es gerade mit Grok versucht. Der Code ist nicht so schön und kurz wie dein, aber auch optimiert. @Delphi.Narium Danke, werde ich auch noch hinzufügen. Das mit Groß- und Kleinschreibung hatte ich bereits, aber die Umlaute sollten auch entfernt werden. |
AW: Wie kann man diesen Code optimieren
Wenn es wirklich auf Performance ankommt, würde ich den letzten Vorschlag favorisieren. Allerdings würde ich sowas wie Result := Result + 'xyz'; vermeiden und stattdessen auf Operationen mit PChar setzen. Das geht in der Regel deutlich schneller.
|
AW: Wie kann man diesen Code optimieren
@Alallart
Beruflich nutze ich ChatGPT (lizensiert). Die Daten bleiben in der Firma. Privat bleibe ich in Europa mit "Le Chat". Bei ein paar Vergleichen habe ich festgestellt, dass die Ergebnisse zwischen den Beiden sehr ähnlich sind. Zum Spaß bei der Programmierung: Routine-Aufgaben lasse ich inzwischen sehr oft durch die KI erledigen. In deinem Beispiel war es eine Optimierung des Sources. Allerdings hätte ich die KI vermutlich gleich gefragt, wie die Routine aussehen muss, statt selbst erst was zu tippen und dann optimieren zu lassen. ;-) Man muss sich aber auch etwas damit beschäftigen, damit man lernt, die richtigen Fragen zu stellen. Und man sollte trotzdem immer noch mal prüfen, ob das Ergebnis wirklich das macht, was man möchte. |
AW: Wie kann man diesen Code optimieren
Zitat:
Delphi, ICS: Wie kann ich... Zitat:
Halluzinationen kommen öfter mal vor. |
AW: Wie kann man diesen Code optimieren
Zitat:
Mir wollte die KI "class operator implicit" für eine Klasse aufdrängen. Geht aber leider nur mit Records. Wenn man das dann nicht weiß, sucht man den Fehler an der falschen Stelle. ;-) |
AW: Wie kann man diesen Code optimieren
Ungetestet: Vieleicht so, oder ähnlich um in einem Durchlauf alle Zeichen zu entfernen?
Delphi-Quellcode:
uses
System.SysUtils, System.Classes; const Removals : set of Char = [' ', '-', Chr(151), '_', ':', ';', ',', '.', '!', '''']; function CleanUpTextUsingBuilder(const S: string): string; var i : Integer; sb : TStringBuilder; begin sb := TStringBuilder.Create(Length(S)); try for i := 1 to Length(S) do begin if not (S[i] in Removals) then sb.Append(S[i]); end; Result := sb.ToString; finally sb.Free; end; end; |
AW: Wie kann man diesen Code optimieren
Das erinnert mich ein wenig an
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 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