Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie kann man diesen Code optimieren (https://www.delphipraxis.net/217031-wie-kann-man-diesen-code-optimieren.html)

Alallart 10. Apr 2025 11:36

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;

Jasocul 10. Apr 2025 11:41

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;

Delphi.Narium 10. Apr 2025 11:47

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:
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;
Bringt das was?

Alallart 10. Apr 2025 12:21

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.

Papaschlumpf73 10. Apr 2025 12:23

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.

Jasocul 10. Apr 2025 12:39

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.

jaenicke 10. Apr 2025 13:38

AW: Wie kann man diesen Code optimieren
 
Zitat:

Zitat von Jasocul (Beitrag 1547988)
Man muss sich aber auch etwas damit beschäftigen, damit man lernt, die richtigen Fragen zu stellen.

Und man muss genau spezifizieren, was man eigentlich haben möchte. Wenn man dabei ausführlich ist, bekommt man meist sehr gute Ergebnisse. Ich beginne Fragen z.B. mit:
Delphi, ICS: Wie kann ich...

Zitat:

Zitat von Jasocul (Beitrag 1547988)
Und man sollte trotzdem immer noch mal prüfen, ob das Ergebnis wirklich das macht, was man möchte.

Und bevor man hier solchen Code postet oder jemandem schickt, sollte man ihn auch zumindest versuchen zu kompilieren. Es kam bei mir z.B. schon vor, dass ChatGPT fest behauptet hat, dass Delphi eine bestimmte Klasse hat, sogar deren Eigenschaften beschrieben hat, aber auf Nachfrage zugeben musste, dass es die gar nicht gibt...
Halluzinationen kommen öfter mal vor.

Jasocul 10. Apr 2025 14:10

AW: Wie kann man diesen Code optimieren
 
Zitat:

Zitat von jaenicke (Beitrag 1547993)
Zitat:

Zitat von Jasocul (Beitrag 1547988)
Und man sollte trotzdem immer noch mal prüfen, ob das Ergebnis wirklich das macht, was man möchte.

Und bevor man hier solchen Code postet oder jemandem schickt, sollte man ihn auch zumindest versuchen zu kompilieren. Es kam bei mir z.B. schon vor, dass ChatGPT fest behauptet hat, dass Delphi eine bestimmte Klasse hat, sogar deren Eigenschaften beschrieben hat, aber auf Nachfrage zugeben musste, dass es die gar nicht gibt...
Halluzinationen kommen öfter mal vor.

Definitiv.
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. ;-)

Rollo62 10. Apr 2025 15:11

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;

DeddyH 10. Apr 2025 18:24

AW: Wie kann man diesen Code optimieren
 
Das erinnert mich ein wenig an diesen Thread.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr.
Seite 1 von 2  1 2      

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