AGB  ·  Datenschutz  ·  Impressum  







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

Suche effizienter machen

Ein Thema von Zioone · begonnen am 19. Sep 2008 · letzter Beitrag vom 23. Sep 2008
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Zioone

Registriert seit: 3. Sep 2008
49 Beiträge
 
Delphi 7 Professional
 
#1

Suche effizienter machen

  Alt 19. Sep 2008, 13:11
Hallo,
mein Programm soll für voreingestellte Schlüsselwörter, wenn etwas gesucht oder die Datei geöffnet wurde, farbig hervorheben.

Das funktioniert auch.
Mein Problem ist nur, wenn ich sehr große Dateien habe ala Zeilen >2000, dann dauert das eine halbe Ewigkeit.

Ich wollte nur mal wissen ob wer eine Idee hat, dieses Suchen/markieren effizienter zu machen oder ob ich mit der Geschwindigkeit leben muss.
Hier der Code:
Delphi-Quellcode:
i2:=0;

    for ii := 0 to FSelectCount-1 do
    begin
      if FSelect.Strings[ii] <>'then
      begin
        if (text<>'') OR (text2<>'') OR (text3<>'') then
        begin
          if (Pos( LowerCase(text), LowerCase( FSelect.Strings[ii] ) )) > 0 then
          begin
            i:=Pos( LowerCase(text), LowerCase( FSelect.Strings[ii] ) );
            mmoLines.SelStart := i+i2-1;
            mmoLines.SelLength := Length(text);
            mmoLines.SelAttributes.Color := c;
            mmoLInes.SelAttributes.Style := [fsBold];
            mmoLines.SelLength := 0;
          end;
          if Pos( LowerCase(text2), LowerCase( FSelect.Strings[ii] ) ) > 0 then
          begin
            i:=Pos( LowerCase(text2), LowerCase( FSelect.Strings[ii] ) );
            mmoLines.SelStart := i+i2-1;
            mmoLines.SelLength := Length(text2);
            mmoLines.SelAttributes.Color := c2;
            mmoLInes.SelAttributes.Style := [fsBold];
            mmoLines.SelLength := 0;
          end;
          if Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) ) > 0 then
          begin
            i:=Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) );
            mmoLines.SelStart := i+i2-1;
            mmoLines.SelLength := Length(text3);
            mmoLines.SelAttributes.Color := c3;
            mmoLInes.SelAttributes.Style := [fsBold];
            mmoLines.SelLength := 0;
          end;
        end;
      end;
        i2 := i2+Length(FSelect.Strings[ii])+2;
    end;
wobei FSelect eine Stringlist ist
und text und color und c aus einer ini datei gelesen werden

über Ideen wäre ich dankbar
Christine
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#2

Re: Suche effektiver machen

  Alt 19. Sep 2008, 13:29
Moin, Moin,
Spontan drei Bemerkungen dazu:
1) Das ständige "LowerCase(FSelect.Strings[ii])" kostet Zeit und würde überflüssig, wenn es 1x VOR der Schleife erledigt wird.
2) Prüfe, ob die Suche nach einem Schlüsselwort in der Stringlliste mit IndexOf() schneller ist als mit Pos()
3) Wenn dein Code seinen Zweck erfüllt, ist er bereits effektiv! Wenn er seinen Zweck erfüllen und besonders schnell sein soll, dann ist er effizient!
Ralph
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Suche effektiver machen

  Alt 19. Sep 2008, 13:35
Hallo,

mal so ein bisserl schmutzig von mir dahingeschrieben:

if (text<>'') OR (text2<>'') OR (text3<>'') then Mach Dir dafür 'nen boolschen Schalter, dann musst Du nur einmal abfragen

b := (text<>'') OR (text2<>'') OR (text3<>''); Das kannst Du schon vor Deiner For-Schleife machen, ist b = false, kannst Du Dir die For-Schleife direkt sparen.

Text... werden bei jeder Abfrage mit Lowercase behandelt, mache das einmal vor der Schleife.
Delphi-Quellcode:
if Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) ) > 0 then
begin
  i:=Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) );
Prüfe bitte, ob Du vorab auch FSelect.Strings[ii] in Lowercase wandeln kannst, dann mach das vorab in einer separaten Schleife.

Die Position wird hier zweimal ermittelt, eventuell machst Du das besser so:
Delphi-Quellcode:
i := Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) );
if i > 0 then
begin
@taaktaak, IndexOf ist hier nicht geeignet, da nicht nach Strings in der Liste gesucht wird, sondern nach Teilstrings in den einzelnen Listeneinträgen, das kann IndexOf meines Wissens nicht.

Stephan

PS: taaktaak war schneller als ich
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Suche effektiver machen

  Alt 19. Sep 2008, 13:38
Hallo,


wenn du die Einfärbung nur brauchst um sie auf dem Bildschirm darzustellen dann ist es effizienter wenn du nur die Zeilen bearbeitest, die momentan sichtbar sind.

Dafür gibt es mit der SynEdit auch schon fertige Komponenten.


mfg DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Zioone

Registriert seit: 3. Sep 2008
49 Beiträge
 
Delphi 7 Professional
 
#5

Re: Suche effizienter machen

  Alt 19. Sep 2008, 13:55
danke schon mal für die Antworten

Nur was ich nicht ganz verstehe ist das ich das LowerCase vor der Schleife machen soll.
Sann kennt er doch gar nicht "ii"?!
und wenn ich das wieder in einer Schleife mache, hab ich ja auch nichts mit gewonnen o_O

Sorry, bin Anfänger ^^'
Christine
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#6

Re: Suche effizienter machen

  Alt 19. Sep 2008, 14:00
Mir ist nicht klar, wie du die Schlüsselwörter bereitstellst.
Lege eine Stringlist an, in der jedes Schlüsselwort ein Listenelement ist und dort als LowerCase abgelegt ist. Dann kannst du auch mit IndexOf() arbeiten.
Ralph
  Mit Zitat antworten Zitat
Zioone

Registriert seit: 3. Sep 2008
49 Beiträge
 
Delphi 7 Professional
 
#7

Re: Suche effizienter machen

  Alt 19. Sep 2008, 14:04
Die Schlüsselwörter speicher ich vorher in eine IniDatei
und lese sie dann an der Stelle wieder aus
Delphi-Quellcode:
ini :=TIniFile.Create(ExtractFilePath(ParamStr(0))+'settings.ini');
  
    text := ini.ReadString('settings','text1','Error');
    color := ini.ReadString('settings','color1','clred');
    if color<>'then
    begin
      c:=StringToColor(color);
    end;
jetzt nur mal für den ersten text
Christine
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: Suche effizienter machen

  Alt 19. Sep 2008, 14:08
Hallo,
Zitat von Zioone:
danke schon mal für die Antworten

Nur was ich nicht ganz verstehe ist das ich das LowerCase vor der Schleife machen soll.
Sann kennt er doch gar nicht "ii"?!
und wenn ich das wieder in einer Schleife mache, hab ich ja auch nichts mit gewonnen o_O

Sorry, bin Anfänger ^^'
Ich versuchs mal:

Für jeden Eintrag in FSelect.Strings werden text, text2 und text3 in Lowercase gesetzt. Das kannst Du vor der Schleife machen, diese Werte sind unabhängig vom Inhalt der Strings.

Wenn Du ohne Probleme FSelect.Strings in Kleinbuchstaben umwandeln kannst, weil es ausserhalb der Schleife z. B. nicht gebraucht wird, dann mach' eine zweite Schleife vor die jetzige Schleife.

for ii := 0 to FSelect.count - 1 ) do FSelect.Strings[ii] := lowercase(FSelect.Strings[ii]); dann wird aus
Delphi-Quellcode:
if Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) ) > 0 then
begin
  i:=Pos( LowerCase(text3), LowerCase( FSelect.Strings[ii] ) );
Delphi-Quellcode:
if Pos(text3,FSelect.Strings[ii]) > 0 then
begin
  i:=Pos(text3,FSelect.Strings[ii]);
und wenn Du das dann noch vertauschst, wird daraus
Delphi-Quellcode:
i:=Pos(text3,FSelect.Strings[ii]);
if i > 0 then
begin
Dadurch sparst Du Dir sehr viele Lowercase und sehr viele Pos.

Stephan
  Mit Zitat antworten Zitat
Zioone

Registriert seit: 3. Sep 2008
49 Beiträge
 
Delphi 7 Professional
 
#9

Re: Suche effizienter machen

  Alt 19. Sep 2008, 14:21
ah, ok jetzt hab ich das verstanden.
Danke

Nur ob ich die Strings[ii] in einer seperaten schleife klein mache oder in der "richtigen" ist doch eigentlich egal?!

Und wie könnt ich jetzt mal am besten testen (in Zeitwerten) wie effizienter das ganze geworden ist?
So rein nach Gefühl ist das denke schon bisschen schneller, aber würde mich mal interessieren wie viel das nun genau gebracht hat.
Muss ich dafür jetzt testweise kompletten Timer programmieren?
Christine
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: Suche effizienter machen

  Alt 19. Sep 2008, 14:43
Hallo,
Zitat von Zioone:
ah, ok jetzt hab ich das verstanden.
Danke

Nur ob ich die Strings[ii] in einer seperaten schleife klein mache oder in der "richtigen" ist doch eigentlich egal?!

Und wie könnt ich jetzt mal am besten testen (in Zeitwerten) wie effizienter das ganze geworden ist?
So rein nach Gefühl ist das denke schon bisschen schneller, aber würde mich mal interessieren wie viel das nun genau gebracht hat.
Muss ich dafür jetzt testweise kompletten Timer programmieren?
Nein, in der separaten Schleife machst Du alles nur einmal kein, in der großen Schleife jedes mal, für Text, für text2 und text3.

Wenn die Liste also 1000 Einträge enthält, wird jeder Eintrag der Stringliste 1 mal kleingemacht.
In Deiner Variante wird jeder Eintrag der Stringliste 1000 mal drei mal kleingemacht. Das läppert sich zusammen, auch wenn einmal kleinmachen allein gaaaanz schnell geht

Was das bringt: Nimm Deine "alte" Fassung mit einer definierten Liste und definiertem Text und schau auf die Uhr, wielange das dauert. Dann überarbeitest Du das Programm und machst den gleichen Test nochmal.

Die Uhr kannst Du Dir mit Delphi "selber bauen".

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

Stephan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 15:29 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