AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Code Optimierung

Ein Thema von TheReaper · begonnen am 22. Okt 2004 · letzter Beitrag vom 9. Nov 2004
Antwort Antwort
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#1

Code Optimierung

  Alt 22. Okt 2004, 15:31
Hallo DP!

Ich habe einen Algorithmus geschrieben um Datein in einem angegebenen Verzeichnis und Unterverzeichnissen zu Suchen. Der Code Funktioniert sehr gut, aber wenn es eine hohe Anzahl an dateien ist (>2000) dauert es sehr sehr lange (>10 min bei XP2100+, ATA133 HDD) bis alles durchsucht wurde.

Code:
procedure GetFilesInDirectoryMP3(ADirectory: string; AMask: String; ARekursiv: Boolean);
var
SR: TSearchRec;
Value, M, S : Integer;
begin
if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then
ADirectory:=ADirectory+'\';

if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then
begin
repeat
if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then

//ID3Tags, speichern ... einfügen

  MP3.Execute(ADirectory+SR.Name);

  if MP3.ID3v2TLEN<>'' then
     begin
     Value := Trunc(strtoint(mp3.ID3v2TLEN) / 1000);
     M := (value mod 3600) div 60;
     S := (value mod 3600) mod 60;
  end else begin
     Value := Trunc(mp3.spielzeit);
     M := (value mod 3600) div 60;
     S := (value mod 3600) mod 60;
  end;

  mp3liste.Artist:='+ '+MP3.ID3v2TPE1;
  mp3liste.Album:=MP3.ID3v2TALB;
  mp3liste.Titel:=MP3.ID3v2TIT2;
  mp3liste.Genre:=mp3.ID3v2TCON;
  mp3liste.Zeit:=Format('%2.2d:%2.2d', [M, S]);
  mp3liste.TrackNr:=MP3.ID3v2TRCK;
  mp3liste.Dateiname:=SR.Name;
  mp3liste.Pfad:=ADirectory;
  write(f3,mp3liste);


until FindNext(SR)<>0;
FindClose(SR);
end;

// Unterverzeichnis durchsuchen
if ARekursiv then
if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
begin
repeat
  if (SR.Name<>'.') and (SR.Name<>'..') then
    GetFilesInDirectoryMP3(ADirectory+SR.Name,AMask,True);
until FindNext(SR)<>0;
FindClose(SR);
end;
end;
Meine Frage: Hat jemand eine Idee wie den Code schneller machen kann?
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#2

Re: Code Optimierung

  Alt 22. Okt 2004, 16:41
Delphi-Quellcode:
...

//ID3Tags, speichern ... einfügen
  if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then
    MP3.Execute(ADirectory+SR.Name);

  if MP3.ID3v2TLEN<>'then
     Value := Trunc(strtoint(mp3.ID3v2TLEN) / 1000);
  else
     Value := Trunc(mp3.spielzeit);

  M := (value mod 3600) div 60;
  S := (value mod 3600) mod 60;

  mp3liste.Artist:='+ '+MP3.ID3v2TPE1;
  mp3liste.Album:=MP3.ID3v2TALB;
  mp3liste.Titel:=MP3.ID3v2TIT2;
  mp3liste.Genre:=mp3.ID3v2TCON;
  mp3liste.Zeit:=Format('%2.2d:%2.2d', [M, S]);
  mp3liste.TrackNr:=MP3.ID3v2TRCK;
  mp3liste.Dateiname:=SR.Name;
  mp3liste.Pfad:=ADirectory;
  write(f3,mp3liste);

...
end;


diesen teil solltest du später erledigen,
d.h. estmal alle dateien suchen, die du brauchst, diese in eine stringlist schreiben und dann später verarbeiten, gerade das write wird viel zeit in anspruch nehmen
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Code Optimierung

  Alt 22. Okt 2004, 18:21
Zitat:
diesen teil solltest du später erledigen,
d.h. estmal alle dateien suchen, die du brauchst, diese in eine stringlist schreiben und dann später verarbeiten, gerade das write wird viel zeit in anspruch nehmen
was hätte das für einen Sinn später alles in ne datei zu schreiben? das wäre dann theroetisch noch langsamer.

statt: datei suchen --> bearbeiten --> Datei speichern --> Nächste Datei
so: datei suchen --> In Stringlist schmeißen --> Nächste Datei --> Stringlist auslesen --> bearbeiten --> Datei Speichern --> Nächste Datei der Stringlist

Die ersten 3 Schritte wären ja schneller aber danach muss ich ein 2. mal jede einzelne Datei öffnen und die Tags auslesen. Oder hab ich das falsch verstanden?
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: Code Optimierung

  Alt 22. Okt 2004, 18:58
naja, aber zb winamp machts ja so:

erstmal nur einlesen...

die tags kommen erst wenn man sie auch abspielt/sie in der playlist sieht
das könntest du auch machen

dann brauch es zwar insgesamt länger, aber der user merkt es nicht...das is der trick
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Code Optimierung

  Alt 22. Okt 2004, 19:16
Ich kann die daten (ID3Tags) nicht erst in der Playlist auslesen. Dadurch würden andere Dinge nicht mehr funktionieren. Beim erstellen der MP3 Liste muss einiges ausgelesen und gespeichert werden. Das ist mein Problem sonst hätt ich das schon per Playlist im WinAmp oder MediaPlayer Style gemacht.
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#6

Re: Code Optimierung

  Alt 22. Okt 2004, 19:16
also ich habs bei meinem player so gemacht:
+ files in liste einfügen
+ anschliessend thread starten, der die ID3 infos ausliest und gleich die liste aktualisiert

hat auch den vorteil, dass der player gleich voll funktionsfähig ist, da der thread alles im hintergrund erledigt (nidriegste Priorität!)
musst nur aufpassen, wenn der thread noch aktualisiert und du an der liste was veränderst (speziell löschen von einträgen)

gruss,
iaby
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Code Optimierung

  Alt 22. Okt 2004, 19:17
Moin TheReaper,

diese Abfrage

SR.Attr<>faDirectory ist aber gefährlich, denn sobald auch ein anderes Attribut, zusätzlich zum Attribut Directory enthalten ist, ist die Bedingung erfüllt.

Besser ist gezielt das Attribut abzufragen

(SR.Attr and faDirectory) = 0
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Code Optimierung

  Alt 22. Okt 2004, 21:36
Ich hab mittlerweile rausgefunden warum das so lange dauerte. Beim Auslesen eines Tags von einer bestimmten Datei war eine Schleife die fast Endlos war. Warum? Keine Ahnung . Mit anderen Playern ging das ohne Probs und mit nem Program zum ID3Tags auslesen gabs auch keine Probs. Ich hab den Code etwas optimiert und für alle die es interessiert Hier isser:

Code:
...

var Pfad array of string;

...

procedure GetFilesInDirectoryMP3(ADirectory: string; AMask: String; ARekursiv: Boolean);
var
SR: TSearchRec;
begin
if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then
ADirectory:=ADirectory+'\';
if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then
begin
repeat
if (SR.Name<>'.') and (SR.Name<>'..') and ((SR.Attr and faDirectory) = 0) then

  Setlength(Pfad,length(Pfad)+1);
  Pfad[high(Pfad)]:=ADirectory+SR.Name;

until FindNext(SR)<>0;
FindClose(SR);
end;
if ARekursiv then
if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
begin
repeat
if (SR.Name<>'.') and (SR.Name<>'..') then
GetFilesInDirectoryMP3(ADirectory+SR.Name,AMask,True);
until FindNext(SR)<>0;
FindClose(SR);
end;
end;

procedure Tfrm2wnl.BitBtn1Click(Sender: TObject);
var
i:integer;
Value, M, S : Integer;
begin
seek(f3,filesize(f3));
getfilesindirectoryMP3(directorylistbox1.Directory,'*.mp3' ,true);
if high(pfad)>=1 then
frm2wnl.progressbar1.Max:=high(pfad);

for i:=0 to high(pfad) do
begin
if Uppercase(ExtractFileExt(pfad[i]))<>'.MP3' then Continue;

  MP3.Execute(pfad[i]);
  if MP3.ID3v2TLEN<>'' then
     Value := Trunc(strtoint(mp3.ID3v2TLEN) / 1000)
  else
     Value := Trunc(mp3.spielzeit);

  M := (value mod 3600) div 60;
  S := (value mod 3600) mod 60;

  if MP3.ID3v2TPE1<> '' then mp3liste.Artist:='+ '+MP3.ID3v2TPE1   //Das mit dem '+' passt schon. Einfach ignorieren.
  else mp3liste.Artist := '+ Unbekannt';
  if MP3.ID3v2TALB<> '' then mp3liste.Album:=MP3.ID3v2TALB
  else mp3liste.Album := 'Unbekannt';
  if MP3.ID3v2TIT2<> '' then mp3liste.Titel:=MP3.ID3v2TIT2
  else mp3liste.Titel := 'Unbekannt';
  if mp3.ID3v2TCON<> '' then mp3liste.Genre:=mp3.ID3v2TCON
  else mp3liste.Genre := 'Unbekannt';

  mp3liste.Zeit:=Format('%2.2d:%2.2d', [M, S]);

  if MP3.ID3v2TRCK<> '' then mp3liste.TrackNr:=MP3.ID3v2TRCK
  else mp3liste.TrackNr := '00';

  if fileexists (pfad[i]) then
  begin
  mp3liste.Dateiname:=ExtractFileName(Pfad[i]);
  mp3liste.Pfad:=ExtractFilePath(Pfad[i]);
  end;

  write(f3,mp3liste);
  frm2wnl.progressbar1.position:=i;
end;

...

end;
Wenn einer ne Idee hat diesen Code noch besser zu machen dann soll er es bitte nicht für sich behalten.
  Mit Zitat antworten Zitat
Benutzerbild von punker76
punker76

Registriert seit: 11. Jan 2004
Ort: Alsdorf
98 Beiträge
 
Delphi 7 Personal
 
#9

Re: Code Optimierung

  Alt 9. Nov 2004, 11:00
if Uppercase(ExtractFileExt(pfad[i]))<>'.MP3then Continue; brauchst du eigentlich nicht, da du ja sowieso nach mp3's suchst...

getfilesindirectoryMP3(directorylistbox1.Directory,'*.mp3' ,true);
Jan Karger
Punk's not dead!!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz