Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suche effizienter machen (https://www.delphipraxis.net/120958-suche-effizienter-machen.html)

jfheins 19. Sep 2008 15:00

Re: Suche effizienter machen
 
Zitat:

Zitat von nahpets
Die Uhr kannst Du Dir mit Delphi "selber bauen".

Vorher:
Delphi-Quellcode:
ShowMessage(DateTimeToStr(Now));
Uhrzeit aufschreiben
Nachher:
Delphi-Quellcode:
ShowMessage(DateTimeToStr(Now));
Uhrzeit aufschreiben und Zeitdifferenz ausrechnen.

Stephan

Diese Methode eigent sich besonders gut - allerdings weniger um die Zeit des Verfahrens zu messen, als vielmehr die Schreibgeschwindigkeit :mrgreen:

(Während des showmessages() ist das Programm angehalten. Du stoppst also die Zeit, die du zum schreiben brauchst + Zeit der Funktion)

Besser ist es natürlich, die Zeit in einer Variablen zu speichern und nachher die different zu nehemen. Siehe hierzu auch GetTickCount - das ist dann direkt in Millisekunden ;)

nahpets 19. Sep 2008 15:19

Re: Suche effizienter machen
 
Hallo jfheins,

Du hast natürlich recht, wenn es Dir um sehr präzise Zeitmessungen geht, aber wenn ich eine Schleife über ein paar tausend Zeilen mache und feststelle, dass dauert 10 Minuten und beim nächsten Mal, nachdem ich das Programm geändert habe, dauert es fünf Minuten, dann reicht meine "manuelle" Stopuhr, gehe hier in dem Beispiel nicht davon aus, dass wir hier irgendwas hochperformantes bauen wollen. Klar könnte man vor der Schleife die Zeit oder Tickcount auf ein Label schreiben, nachher auf ein Anderes und auf ein Drittes die Differenz.

Wollte mit komplizierten Beispielen neben dem eigentlichen Problem nicht noch 'nen "Fragenkatalog" aufmachen. :wink:

Stephan

alzaimar 19. Sep 2008 15:35

Re: Suche effizienter machen
 
Wörter sucht man am schnellsten mit einem Dawg oder einer Hashmap ('TStringDictionary'). Such mal hier danach...

jfheins 19. Sep 2008 15:44

Re: Suche effizienter machen
 
Zitat:

Zitat von nahpets
Hwenn ich eine Schleife über ein paar tausend Zeilen mache und feststelle, dass dauert 10 Minuten und beim nächsten Mal, nachdem ich das Programm geändert habe, dauert es fünf Minuten, dann reicht meine "manuelle" Stopuhr

Das mag sein - aber wenn das hervorheben vön Wörtern in einem Textfeld länger dauert als eine Sekunde, dann läuft da irgendetwas gehörig schief ;)

@Topic:

Hast du mal versucht, den Code zwischen BeginUpdate() und EndUpdate() zu platzieren?
Das könnte auch noch einmal schneller sein ;)

Zioone 21. Sep 2008 21:37

Re: Suche effizienter machen
 
Hi,
und sorry das ich mich jetzt erst wieder melde^^.

Da ich Anfänger bin hab ich leider kein Plan was BeginUpdate() und EndUpdate(). Wo kann ich da Code plazieren oder wie funktioniert das? Aus Internetsuche bin ich da leider auch nicht sonderlich schlau geworden.

ebenso wenig aus TStringDictionary. So ganz schlau bin ich da auch nicht draus geworden. Wäre schön wenn da jemand mir noch mal helfen könnte^^

Zioone 23. Sep 2008 09:49

Re: Suche effizienter machen
 
ok, noch mal anderes gefragt
hab noch mal gesucht und bissel was gefunden, wegen dem beginupdate und endupdate.
das ganze bringt jetzt, wenn überhaupt eine sekunde gewinn. Hab ich das an der falschen stelle oder falsch verstanden?
Delphi-Quellcode:
 b := (text<>'') OR (text2<>'') OR (text3<>'');

    if b=true then
    begin
      text:=LowerCase(text);
      text2:=LowerCase(text2);
      text3:=LowerCase(text3);

      mmoLines.Lines.BeginUpdate;
      for ii := 0 to FSelect.Count-1 do
      begin
        if FSelect.Strings[ii] <>'' then
        begin
          i := Pos( text, LowerCase(FSelect.Strings[ii]) );
          if i > 0 then
          begin
            mmoLines.SelStart := i+i2-1;
            mmoLines.SelLength := Length(text);
            mmoLines.SelAttributes.Color := c;
            mmoLInes.SelAttributes.Style := [fsBold];
            mmoLines.SelLength := 0;
          end;
          i := Pos( text2, LowerCase(FSelect.Strings[ii]) );
          if i > 0 then
          begin
            mmoLines.SelStart := i+i2-1;
            mmoLines.SelLength := Length(text2);
            mmoLines.SelAttributes.Color := c2;
            mmoLInes.SelAttributes.Style := [fsBold];
            mmoLines.SelLength := 0;
          end;
          i := Pos( text3, LowerCase(FSelect.Strings[ii]) );
          if i > 0 then
          begin
            mmoLines.SelStart := i+i2-1;
            mmoLines.SelLength := Length(text3);
            mmoLines.SelAttributes.Color := c3;
            mmoLInes.SelAttributes.Style := [fsBold];
            mmoLines.SelLength := 0;
          end;
        end;
        i2 := i2+Length(FSelect.Strings[ii])+2;
      end;
      mmoLines.Lines.EndUpdate;
    end;

taaktaak 23. Sep 2008 10:00

Re: Suche effizienter machen
 
Was ich immer noch nicht verstehe:
Warum ziehst du das mehrfache
Delphi-Quellcode:
LowerCase(FSelect.Strings[ii])
nicht vor die Schleife?
Und das "if b=true then.." sollte man auch nicht tun (vorher wars besser)

Zioone 23. Sep 2008 10:04

Re: Suche effizienter machen
 
hi,
1. weil es eh kein gewinn gebracht hat an Zeit
2. wenn ich es einmal davor mache, hat er meinen Text komplett klein gemacht (logisch) nur wenn ich dann was gesucht habe, war der Text auch komplett klein, was mir nichts bringt. Und dann bringt mir mein "groß/kleinschreibung beachten - button" nichts mehr *gg*
aber wie gesagt es hat, bei einer ungefähr 500kb großen datei mit ca. 6800 Zeilen, eh nichts gebracht.

und wieso war das b=true vorher besser?

Tyrael Y. 23. Sep 2008 10:08

Re: Suche effizienter machen
 
Für die Geschwindigkeitmessung würde ich folgendermassen vorgehen.

Delphi-Quellcode:
var LBegin,
    LEnd: integer;

    LTime: String;
begin
  LBegin := GetTickCount();
  try
    HierMacheIchDieArbeit();
  finally
    LEnd := GetTickCount;
   
    EinLabel.Caption := IntToStr(LEnd - LBegin);
   
  end;
end;

Zioone 23. Sep 2008 10:22

Re: Suche effizienter machen
 
sind das millisekunden?

also auf alle Fälle mal alles durchprobiert:
30282 mit beginupdate/endupdate ohne extra schleife für Lowercase
30578 ohne beginupdate/endupdate ohne extra schleife für Lowercase
30219 mit beginupdate/endupdate mit extra schleife für Lowercase
30906 ohne beginupdate/endupdate mit extra schleife für Lowercase


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 Uhr.
Seite 2 von 4     12 34      

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