Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.227 Beiträge
 
Delphi 12 Athens
 
#6

Re: Suchschleife auf 2 Threads / CPUs aufteilen (OpenMP?)

  Alt 11. Apr 2007, 06:48
Die ganzen ansilowercase würde ich mal irgendwie rausnehmen.

Am einfachsten wäre es wohl auch, da Stringoperationen mit zu den Langsamsten gehören und und dazu noch für jedes ansilowercase bei jedem Aufruf der IF-Abfrage eine tempräre Stringvariable angelegt wird (speicher resservieren/freigeben), wo dann der kleingeschriebene Text drinsteht.

Wenn du häufig suchst, wäre es da wohl einfacher, wenn du noch ein zweites Array mit den kleingeschriebenen Texten erstellst, oder auch gleich die Mleingeschriebenen mit in dieses Array aufnimmst.

Das ergibt dann zwar die doppelte Datenmänge, aber erspart das ständige Umgewandle.

z.B. so:
du müßtest dann nur jedesmal wenn was in einem Eintrag geändert wurde ein Update dieses Eintrags vornehmen.
Und dann einfach nur in der Suche die
Delphi-Quellcode:
type TID3Tag = record
    Titel : string;
    Artist : string;
    Album : string;
    Year : string;
    Comment : string;
    Genre : string;
    Track : integer;
  end;

  TMp3Eintrag = record
      Filename : string;
      Path : string;
      Anzeige : boolean;
      Id3tag : Tid3tag;
      lowercase: record
        Filename : string;
        Path : string;
        Id3tag : Tid3tag;
      end;
  end;

procedure updade(ListenNummer, ArrayIndex: integer);
  begin
    Mp3Daten[ListenNummer, ArrayIndex].lowercase.Filename :=
      ansilowercase(Mp3Daten[ListenNummer, ArrayIndex].Filename);
    Mp3Daten[ListenNummer, ArrayIndex].lowercase.Path :=
      ansilowercase(Mp3Daten[ListenNummer, ArrayIndex].Path);
    Mp3Daten[ListenNummer, ArrayIndex].lowercase.Id3tag.Titel :=
      ansilowercase(Mp3Daten[ListenNummer, ArrayIndex].Id3tag.Titel);
    ...
    Mp3Daten[ListenNummer, ArrayIndex].lowercase.Id3tag.Genre :=
      ansilowercase(Mp3Daten[ListenNummer, ArrayIndex].Id3tag.Genre);
  end;


  if pos(CurrentSearch, Mp3Daten[ListenNummer,ArrayIndex].lowercase.Filename)
    or pos(CurrentSearch, Mp3Daten[ListenNummer,ArrayIndex].lowercase.Path)
    or pos(CurrentSearch, Mp3Daten[ListenNummer,ArrayIndex].lowercase.id3tag.Titel)
    ...
    or pos(CurrentSearch, Mp3Daten[ListenNummer,ArrayIndex].lowercase.id3tag.Genre)
    <> 0;
So würden die lowercase-Strings ja nur einmal erstellt (wenn du sie für mehrere Suchanfagen verwendest ... bei 'ner einmaligen Suchaktion wären die sogar hinderlich und speicherfressend, da ja beim Auffinden des Suchstrings die nachfolgenden Vergleiche der aktuellen IF-Abfrage entfallen) und dann jedesmal nur in den bereits Existierenden nur noch gesucht und eben nicht jedesmal ein neuer lowercase-String erstellt.

Wenn die lowercase-Strings längere Zeit nicht benötigt werden, kannst du sie ja zwegs Speicherschonung freigeben und dann vor der nächsten Suche wieder erstellen.



ach ja: (bringtzwar nicht viel, aber macht es womöglich etwas übersichtlicher)
Delphi-Quellcode:
if ... then match := true else false;

// entspricht

match := ...;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat