AGB  ·  Datenschutz  ·  Impressum  







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

Strings vergleichen geht SAULAHM!!!

Ein Thema von silentAMD · begonnen am 30. Dez 2004 · letzter Beitrag vom 31. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
silentAMD

Registriert seit: 27. Sep 2003
203 Beiträge
 
Turbo Delphi für Win32
 
#1

Strings vergleichen geht SAULAHM!!!

  Alt 30. Dez 2004, 23:28
hi,
ich in meinem dateimanager mit unten stehender funktion eine zahl aus, um den passenden imageindex eines objekts in einer dateiliste im listview je nach dateityp herauszubekommen. (also e ist dann der dateiname)


Delphi-Quellcode:
function TFenster.GetImgIndex(e: String): Byte;
var
  i: Integer;
begin
  RESULT := 17;
  i := LastDelimiter('.'+PathDelim+DriveDelim, e);
  if (i > 0) and (e[i] = '.') then begin
    e := LOWERCASE(Copy(e, i+1, MaxInt));
    if (e='exe') then
    RESULT := 6
    else if (e='jpg') or (e='jpeg') or (e='bmp') or (e='gif') or (e='png') then
    RESULT := 7
    else if (e='htm') or (e='html') then
    RESULT := 8
    else if (e='txt') or (e='ini') or (e='inf') or (e='css') then
    RESULT := 9
    else if (e='rar') or (e='zip') or (e='cab') then
    RESULT := 10
    else if (e='mp3') or (e='wav') or (e='ogg') or (e='mid') or (e='wma') then
    RESULT := 11
    else if (e='mpg') or (e='mpeg') or (e='mpe') or (e='wmv') or (e='avi') or (e='asf') or (e='mov') or (e='rm') then
    RESULT := 12
    else if (e='doc') or (e='rtf') or (e='pdf') or (e='ppt') then
    RESULT := 13
    else if (e='hlp') or (e='chm') then
    RESULT := 14
    else if (e='swf') then
    RESULT := 15
    else if (e='lnk') then
    RESULT := 16
  end;
end;

ist es hier angebrachter, einfach den dateityp mit der eigenschaft getimageindex herauszubekommmen (was die scrollgeschwindigkeit beeinträchtigt) oder gleich in der suche (ich weise mit dieser funktion gleich in der suche den imageindex zu, was allerdings das einlesen der dateien verlangsamt).

nun meine frage: wie kann ich die obenstehende funktion "schneller machen" (also geschickterer code)?
  Mit Zitat antworten Zitat
Joe24

Registriert seit: 21. Dez 2004
Ort: Berlin
51 Beiträge
 
#2

Re: Strings vergleichen geht SAULAHM!!!

  Alt 30. Dez 2004, 23:31
Anstelle der bedingten Verzweigung (if-then-else) würde ich erstmal eine Case-Strucktur wählen.
Sieht dann schon einmal eleganter aus.

upps! e ist ja kein ordinaler Typ. Zu Spät gesehen.
  Mit Zitat antworten Zitat
Joe24

Registriert seit: 21. Dez 2004
Ort: Berlin
51 Beiträge
 
#3

Re: Strings vergleichen geht SAULAHM!!!

  Alt 30. Dez 2004, 23:51
Das dein Code so langsam ist wird wohl eher an diesem Teil deiner Funktion liegen

Zitat:
Delphi-Quellcode:
...
  i := LastDelimiter('.'+PathDelim+DriveDelim, e);
  if (i > 0) and (e[i] = '.') then begin
    e := LOWERCASE(Copy(e, i+1, MaxInt));
...
den folgenden Teil habe ich 10000000 mal mit einer Schleife aufgerufen, und diese war
nach der Zeitmessung in 4sec durchlaufen.

Zitat:
Delphi-Quellcode:
...
  e := 'lnk';
  RESULT := 17;

 if (e='exe') then
    RESULT := 6
    else if (e='jpg') or (e='jpeg') or (e='bmp') or (e='gif') or (e='png') then
    RESULT := 7
    else if (e='htm') or (e='html') then
    RESULT := 8
    else if (e='txt') or (e='ini') or (e='inf') or (e='css') then
    RESULT := 9
    else if (e='rar') or (e='zip') or (e='cab') then
    RESULT := 10
    else if (e='mp3') or (e='wav') or (e='ogg') or (e='mid') or (e='wma') then
    RESULT := 11
    else if (e='mpg') or (e='mpeg') or (e='mpe') or (e='wmv') or (e='avi') or (e='asf') or (e='mov') or (e='rm') then
    RESULT := 12
    else if (e='doc') or (e='rtf') or (e='pdf') or (e='ppt') then
    RESULT := 13
    else if (e='hlp') or (e='chm') then
    RESULT := 14
    else if (e='swf') then
    RESULT := 15
    else if (e='lnk') then
    RESULT := 16
...
  Mit Zitat antworten Zitat
silentAMD

Registriert seit: 27. Sep 2003
203 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Strings vergleichen geht SAULAHM!!!

  Alt 30. Dez 2004, 23:58
hmmm.... ich hab den code einfach von den sources von delphi übernommen und habs so abgeändert, dass nur die datei-endung ohne punkt erscheint... also ich hab "nur" 2166 mhz und bei mir macht die funktioin schon bei ca. 10000 dateien einen größeren unterschied als 4 sekunden!

da wirst du warscheinlich mit deiner übertakteten cpu mit über 3,8 ghz drangegangen sein...


wenns wirklich am oberen teil hängt: wie soll ich es abändern?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Strings vergleichen geht SAULAHM!!!

  Alt 31. Dez 2004, 00:00
Ganz einfache Idee: Checksumme des Strings berechnen und mit Checksummen der anderen String vergleichen, dann kannst du auch case-of benutzen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Strings vergleichen geht SAULAHM!!!

  Alt 31. Dez 2004, 00:01
Moin!

Delphi-Quellcode:
function TFenster.GetImgIndex(Const AFileName: String): Byte;
Type
  TFileAsso = Record
    Ext : String;
    Idx : Integer;
  End;
Const
  coImageIndex : Array[0..38] Of TFileAsso = (
    ( Ext: 'exe'; Idx: 6 ),

    ( Ext: 'jpg'; Idx: 7 ),
    ( Ext: 'jpeg'; Idx: 7 ),
    ( Ext: 'bmp'; Idx: 7 ),
    ( Ext: 'gif'; Idx: 7 ),
    ( Ext: 'png'; Idx: 7 ),

    ( Ext: 'htm'; Idx: 8 ),
    ( Ext: 'html'; Idx: 8 ),

    ( Ext: 'txt'; Idx: 9 ),
    ( Ext: 'ini'; Idx: 9 ),
    ( Ext: 'inf'; Idx: 9 ),
    ( Ext: 'css'; Idx: 9 ),

    ( Ext: 'rar'; Idx: 10 ),
    ( Ext: 'zip'; Idx: 10 ),
    ( Ext: 'cab'; Idx: 10 ),
    ( Ext: 'ace'; Idx: 10 ),

    ( Ext: 'mp3'; Idx: 11 ),
    ( Ext: 'wav'; Idx: 11 ),
    ( Ext: 'ogg'; Idx: 11 ),
    ( Ext: 'mid'; Idx: 11 ),
    ( Ext: 'wma'; Idx: 11 ),
    ( Ext: 'rma'; Idx: 11 ),

    ( Ext: 'mpg'; Idx: 12 ),
    ( Ext: 'mpeg'; Idx: 12 ),
    ( Ext: 'mpe'; Idx: 12 ),
    ( Ext: 'wmv'; Idx: 12 ),
    ( Ext: 'avi'; Idx: 12 ),
    ( Ext: 'asf'; Idx: 12 ),
    ( Ext: 'mov'; Idx: 12 ),
    ( Ext: 'rm'; Idx: 12 ),

    ( Ext: 'doc'; Idx: 13 ),
    ( Ext: 'rtf'; Idx: 13 ),
    ( Ext: 'pdf'; Idx: 13 ),
    ( Ext: 'ppt'; Idx: 13 ),
    ( Ext: 'pps'; Idx: 13 ),

    ( Ext: 'hlp'; Idx: 14 ),
    ( Ext: 'chm'; Idx: 14 ),

    ( Ext: 'swf'; Idx: 15 ),

    ( Ext: 'lnk'; Idx: 16 ) );
var
  lExt : String;
  i : Integer;
begin
  RESULT := 17;

  lExt := Copy(LowerCase(ExtraFileExt(AFileName)), 2, MaxInt);

  If ( Length(lExt) > 0 ) Then // mehr als nur der Punkt
    For i := Low(coImageIndex) To High(coImageIndex) Do
      If ( coImageIndex[i].Ext = lExt ) Then
      Begin
        Result := coImageIndex[i].Idx;
        Break;
      End;
end;
MfG
Muetze1
  Mit Zitat antworten Zitat
silentAMD

Registriert seit: 27. Sep 2003
203 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Strings vergleichen geht SAULAHM!!!

  Alt 31. Dez 2004, 00:05
wow danke für die arbeit!!!!!
das is ja sowas wie ein array im array oder?

muss gleich mal testen obs schneller geht....


THANX!!!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Strings vergleichen geht SAULAHM!!!

  Alt 31. Dez 2004, 00:10
Moin!

Oh - ich sehe gerade das ein Integer etwas überdimensioniert war, es reicht bei dem Type TFileAsso auch ein Byte für den Idx, aber die Optimierung wird es intern eh wieder zum Integer machen...

Zitat von silentAMD:
das is ja sowas wie ein array im array oder?
Nö, eigentlich nur ein konstantes Array aus Records.

Zitat von silentAMD:
muss gleich mal testen obs schneller geht....
Jo, würde mich mal interessieren...

MfG
Muetze1
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Strings vergleichen geht SAULAHM!!!

  Alt 31. Dez 2004, 01:15
Moin silentAMD,

um mal die Idee von Dax aufzugreifen, mal etwas ähnliches:
Funktioniert allerdings nur bei Erweiterungen mit ein bis vier Zeichen.

Ich hoffe es ist ersichtlich wie sich die Zahlen ergeben.

Delphi-Quellcode:
function Ext2ID(const AsFilepath : string) : integer;

type
  TcsExtToDW = packed record
    case byte of
      0 : (sExt : string[4]);
      1 : (bDummy : byte;
           dwExt : DWORD);
  end;

var
  etdWork : TcsExtToDW;

begin
  Result := -1;
  etdWork.dwExt := 0;
  etdWork.sExt := AnsiLowerCase(copy(ExtractFileExt(AsFilePath),2,4));
  case etdWork.dwExt of
    $00657865 : Result := 6; // exe
    $0067706A, // jpg
    $6765706A, // jpeg
    $00706D62, // bmp
    $00666967, // gif
    $00676E70 : Result := 7; // png
    $006D7468, // htm
    $6C6D7468 : Result := 8; // html
    $00747874, // txt
    $00696E69, // ini
    $00666E69, // inf
    $00737363 : Result := 9; // css
    $00726172, // rar
    $0070697A, // zip
    $00626163, // cab
    $00656361 : Result := 10; // ace
    $0033706D, // mp3
    $00766177, // wav
    $0067676F, // ogg
    $0064696D, // mid
    $00616D77, // wma
    $00616D72 : Result := 11; // rma
    $0067706D, // mpg
    $6765706D, // mpeg
    $0065706D, // mpe
    $00766D77, // wmv
    $00697661, // avi
    $00667361, // asf
    $00766F6D, // mov
    $00006D72 : Result := 12; // rm
    $00636F64, // doc
    $00667472, // rtf
    $00666470, // pdf
    $00747070, // ppt
    $00737070 : Result := 13; // pps
    $00706C68, // hlp
    $006D6863 : Result := 14; // chm
    $00667773 : Result := 15; // swf
    $006B6E6C : Result := 16// lnk
  end;
end;
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
silentAMD

Registriert seit: 27. Sep 2003
203 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Strings vergleichen geht SAULAHM!!!

  Alt 31. Dez 2004, 13:09
hi,

die möglichkeit von Muetze1 ist leider so um die 60% langsamer (bei 1000000 durchläufen)...
hier die wertetabelle:


meine möglichkeit: ~ 0,835528537844894
Muetze1's: ~ 1,40521434986849
Christian Seehase's: ~ 0,802533841591599

und die 4. aus allen: ~ 0,440150074939692


hier ist sie (sogar mit mehr dateitypen):

Delphi-Quellcode:
function GetImgIndex(const lExt: string) : Byte;

type
  TcsExtToDW = packed record
    case byte of
      0 : (sExt : string[4]);
      1 : (bDummy : byte;
           dwExt : DWORD);
  end;

var
  etdWork : TcsExtToDW;
  i: Integer;

begin
  RESULT := 17;
  etdWork.dwExt := 0;
  i := LastDelimiter('.'+PathDelim+DriveDelim, lExt);
  if (i > 0) and (lExt[i] = '.') then begin
    etdWork.sExt := LOWERCASE(Copy(lExt, i+1, MaxInt));


  case etdWork.dwExt of
    $00657865 : Result := 6; // exe
    $0067706A, // jpg
    $6765706A, // jpeg
    $00706D62, // bmp
    $00666967, // gif
    $00676E70 : Result := 7; // png
    $006D7468, // htm
    $6C6D7468 : Result := 8; // html
    $00747874, // txt
    $00696E69, // ini
    $00666E69, // inf
    $00737363 : Result := 9; // css
    $00726172, // rar
    $0070697A, // zip
    $00626163, // cab
    $00656361 : Result := 10; // ace
    $0033706D, // mp3
    $00766177, // wav
    $0067676F, // ogg
    $0064696D, // mid
    $00616D77, // wma
    $00616D72 : Result := 11; // rma
    $0067706D, // mpg
    $6765706D, // mpeg
    $0065706D, // mpe
    $00766D77, // wmv
    $00697661, // avi
    $00667361, // asf
    $00766F6D, // mov
    $00006D72 : Result := 12; // rm
    $00636F64, // doc
    $00667472, // rtf
    $00666470, // pdf
    $00747070, // ppt
    $00737070 : Result := 13; // pps
    $00706C68, // hlp
    $006D6863 : Result := 14; // chm
    $00667773 : Result := 15; // swf
    $006B6E6C : Result := 16// lnk
  end;
end;
end;

bis dateitypen kommen, die mehr als 4 zeichen haben, oder es noch eine schnellere möglichkeit gibt, nehme ich die lösung!!

danke!!!


edit: noch ne frage - WARUM IST ANSILOWERCASE LANGSAMER ALS LOWERCASE????

edit2: und wie macht das der explorer???
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:27 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