AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Performanceproblem mit ca. 30000 Listboxeinträgen
Thema durchsuchen
Ansicht
Themen-Optionen

Performanceproblem mit ca. 30000 Listboxeinträgen

Ein Thema von Hallo_Thomas · begonnen am 12. Mai 2005 · letzter Beitrag vom 18. Mai 2005
Antwort Antwort
Seite 1 von 3  1 23      
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#1

Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 15:23
Ich habe jetzt noch mal die letzten Tage probiert und gemacht aber ich komme irgenwie kein Stückchen vorran! Ich versuche die Geschwindigkeit des Programms im Anhang zu erhöhen, im Moment benötigt es für 30000 zahlen ca. 34s Zeit egal ob ich nun Stringliste benute oder ob ich für

Delphi-Quellcode:
for pl0 := Form1.Anzeige.count - 1 downto 0 do
    begin
      for x := 0 to 81 do
      begin
        if StrToInt(Form1.Anzeige.Items[pl0]) in werte[x] then
          Counte[x] := 0
diese Zeile einsetze

Delphi-Quellcode:
for pl0 := 2 downto 0 do
    begin
      for x := 0 to 81 do
      begin
        if StrToInt(Form1.Anzeige.Items[pl0]) in werte[x] then
          Counte[x] := 0
es ist auch egal ob ich Anzeige.Items.BeginUpdate; einsetze. Der Berechnungszeitraum bleibt bei 34s.




Delphi-Quellcode:
var
  x, i, pl0, Counter: Integer;
  cg, cb : double;
  counte : array[0..81] of Integer;
  werte : array[0..81] of mySet;
begin
  Anzeige.Items.BeginUpdate;
   Label999.Caption:=IntToStr(Anzeige.Items.Count);
  Anzeige.Items.InsertObject(0, AItem, Pointer(AColor));
  DoubleBuffered := True;
  cg := (Form2.SpinEdit1.Value);
  cb := (Form2.SpinEdit2.Value);
    begin
    for i := 0 to 81 do
    begin
      Counte[i] := 0;
    end;
    werte[0] := [1];
    werte[1] := [2];
    werte[2] := [3];
    werte[3] := [4];
    werte[4] := [5];
    werte[5] := [6];
    werte[6] := [7];
    werte[7] := [8];
    werte[8] := [9];
    werte[9] := [10];
    werte[10]:= [11];
    werte[11]:= [12];
    werte[12]:= [1,2];
    werte[13]:= [1,3];
    werte[14]:= [1,4];
    werte[15]:= [1,5];
    werte[16]:= [1,6];
    werte[17]:= [1,7];
    werte[18]:= [1,8];
    werte[19]:= [1,9];
    werte[20]:= [1,10];
    werte[21]:= [1,11];
    werte[22]:= [1,12];
    Werte[23]:= [1,2,3];
    werte[24]:= [1,2,4];
    werte[25]:= [1,2,5];
    werte[26]:= [1,2,6];
    werte[27]:= [1,2,7];
    werte[28]:= [1,2,8];
    werte[29]:= [1,2,9];
    werte[30]:= [1,2,10];
    werte[31]:= [1,2,11];
    werte[32]:= [1,2,12];
    werte[33]:= [1,2,3,4];
    werte[34]:= [1,2,3,5];
    werte[35]:= [1,2,3,6];
    werte[36]:= [1,2,3,7];
    werte[37]:= [1,2,3,8];
    werte[38]:= [1,2,3,9];
    werte[39]:= [1,2,3,10];
    werte[40]:= [1,2,3,11];
    werte[41]:= [1,2,3,12];
    werte[42]:= [1,2,4,5];
    werte[43]:= [1,2,4,6];
    werte[44]:= [1,2,4,7];
    werte[45]:= [1,2,4,8];
    werte[46]:= [1,2,4,9];
    werte[47]:= [1,2,4,10];
    werte[48]:= [1,2,4,11];
    werte[49]:= [1,2,4,12];
    werte[50]:= [1,2,5,6];
    werte[51]:= [1,2,5,7];
    werte[52]:= [1,2,5,8];
    werte[53]:= [1,2,5,9];
    werte[54]:= [1,2,5,10];
    werte[55]:= [1,2,5,11];
    werte[56]:= [1,2,5,12];
    werte[57]:= [1,2,6,7];
    werte[58]:= [1,2,6,8];
    werte[59]:= [1,2,6,9];
    werte[60]:= [1,2,6,10];
    werte[61]:= [1,2,6,11];
    werte[62]:= [1,2,6,12];
    werte[63]:= [1,2,7,8];
    werte[64]:= [1,2,7,9];
    werte[65]:= [1,2,7,10];
    werte[66]:= [1,2,7,11];
    werte[67]:= [1,2,7,12];
    werte[68]:= [1,2,8,9];
    werte[69]:= [1,2,8,10];
    werte[70]:= [1,2,8,11];
    werte[71]:= [1,2,8,12];
    werte[72]:= [1,2,9,10];
    werte[73]:= [1,2,9,11];
    werte[74]:= [1,2,9,12];
    werte[75]:= [1,2,10,11];
    werte[76]:= [1,2,10,12];
    werte[77]:= [1,2,11,12];
    werte[78]:= [1,2,3,4,5];
    werte[79]:= [1,2,3,4,5,6];
    werte[80]:= [1,2,3,4,5,7];
    werte[81]:= [1,2,3,4,5,8];

    for pl0 := Form1.Anzeige.count - 1 downto 0 do
    begin
      for x := 0 to 81 do
      begin
        if StrToInt(Form1.Anzeige.Items[pl0]) in werte[x] then
          Counte[x] := 0
        else
          Inc(Counte[x]);
      end;
      for x := 0 to 81 do
      begin
        (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
          IntToStr(Counte[x]);
      end;
    end;
  end;
Anzeige.Items.endUpdate;
end;
Angehängte Dateien
Dateityp: zip beispiel_183.zip (30,4 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Delphi_Fanatic

Registriert seit: 24. Mär 2004
201 Beiträge
 
#2

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 15:27
Also ich hab' jetzt keine Zeit mir Deinen Quelltext anzuschauen, aber trotzdem mal ein ganz allgemeiner Hinweis :

Setz' Deine Listbox oder was auch immer das sein mag auf InVisible, dann füllst Du die Einträge mit Inhalten, und danach setzt Du die wieder auf Visible.
Wenn das InVisible ist während Du das füllst - dann spart das ungemein Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 15:29
Zitat von Hallo_Thomas:
Delphi-Quellcode:
.
.
.
    for pl0 := Form1.Anzeige.count - 1 downto 0 do
    begin
      for x := 0 to 81 do
      begin
        if StrToInt(Form1.Anzeige.Items[pl0]) in werte[x] then
          Counte[x] := 0
        else
          Inc(Counte[x]);
      end;
      for x := 0 to 81 do
      begin
        (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
          IntToStr(Counte[x]);
      end;
    end;
  end;
end;
Ach Thomas.......

ich habe dir jetzt schon in zwei anderen Threads gesagt (und dir Beispiele geschriebne) das Du die Ausgabe der Ergebnisse aus der Schleife für die Berechnungen hereausnehmen "sollst".
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 15:34
@Sharky, bevor ich Deins jetzt anschaue, erst mal Dankeschön, für die vielen korrekten Antworten. Die waren echt Spitze!!!!!!!!!!!!!!

@Delphi_Fanatic Mit Visible True oder False, die Zeit bleibt bei 34s
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 15:50
@ Sharky

Delphi-Quellcode:
for y := Form1.Anzeige.count - 1 downto 0 do
    begin
      for x := 0 to 409 do
      begin
        if StrToInt(Form1.Anzeige.Items[y]) in werte[x] then
          Counte[x] := 0
        else
          Inc(Counte[x]);
      end;
      for x := 0 to 409 do
      begin
        (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
          IntToStr(Counte[x]);
      end;
    end;

Bis jetzt lagst Du immer richtig, aber dieses einemal nicht, würdch behaupten.
Ich jetzt ein Diese Zeile so ersetzt und unten natürlich
folgendes rausgelöscht.

Delphi-Quellcode:
for x := 0 to 409 do
      begin
        (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
          IntToStr(Counte[x]);
Jetzt sind 5 min rum das Programm rechnet immer noch, glaub ich verzweifle


P.S. Im jetzigen Programm oben und eigenlich auch schon im vorhergehenden Programm waren doch diese anWeisungen getrennt von einnander, dies hat schon einen unheimlichen Leistungsschub gebracht, aber eh bissl fehlt noch
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 16:01
Dumme Frage, aber welcher normaldenkende Mensch soll diese Anzahl an Items denn bitte schön lesen?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 16:05
Zitat:
Delphi-Quellcode:
for x := 0 to 409 do
      begin
        (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
          IntToStr(Counte[x]);
Das kann man umschreiben und damit die versteckte innere Schleife (FindComponent) entfernen.
Delphi-Quellcode:
for i := 0 to ComponentCount - 1 do
begin
  if (Components[i] is TLabel) and AnsiStartsText('Label', Components[i].Name) then
  begin
    x := StrToInt(Copy(Components[i].Name, 6, MaxInt));
    if (x >= 0) and (x <= 409) then
      TLabel(Components[i]).Caption := IntToStr(Counte[x]);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 16:10
Zitat von Hallo_Thomas:
...
Bis jetzt lagst Du immer richtig, aber dieses einemal nicht, würdch behaupten.
Ich jetzt ein Diese Zeile so ersetzt und unten natürlich
folgendes rausgelöscht.
Ich glaube Du hast mich falsch verstanden.
Schauen wir uns mal den Code an:
Delphi-Quellcode:
    for pl0 := Form1.Anzeige.count - 1 downto 0 do // (1) Das ist die Schleife für die Items (30.000)
    begin
      for x := 0 to 81 do // (2) Das ist die Schleife für die Berechnung
      begin
        if StrToInt(Form1.Anzeige.Items[pl0]) in werte[x] then
          Counte[x] := 0
        else
          Inc(Counte[x]);
      end; // (2) Hier endet die Schleife für die Berechnung
      for x := 0 to 81 do // (3) Das ist die Schleife für die Ausgabe
      begin
        (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
          IntToStr(Counte[x]);
      end; // (3) Hier endet die Schleife für die Ausgabe
    end; // (1) hier endet die Schleife für die Items.
  end;
Du weisst also jedem TLabel 30.000 mal einenen wert zu
Wenn Du es aus der Schleife der Items raus nimmst:
Delphi-Quellcode:
    for pl0 := Form1.Anzeige.count - 1 downto 0 do // (1) Das ist die Schleife für die Items (30.000)
    begin
      for x := 0 to 81 do // (2) Das ist die Schleife für die Berechnung
      begin
        if StrToInt(Form1.Anzeige.Items[pl0]) in werte[x] then
          Counte[x] := 0
        else
          Inc(Counte[x]);
      end; // (2) Hier endet die Schleife für die Berechnung
    end; // (1) hier endet die Schleife für die Items.
   for x := 0 to 81 do // (3) Das ist die Schleife für die Ausgabe
   begin
     (FindComponent('Label' + IntToStr(x + 2)) as TLabel).Caption :=
         IntToStr(Counte[x]);
   end; // (3) Hier endet die Schleife für die Ausgabe
  end;
dann weisst Du jedem Label genau einmal einen Wert zu.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 16:16
@jbg Natürlich niemand, aber das Auswertungsprogramm , ungefähr 15 Labels benötigen jede Runde alle, die restlich ca zw. 20-300 Items

Deswegen wollte ich zur Probe erst mal

for x := 2 downto 0 do aber auch dies hat keinen Performance Erfolg gebracht.

Und sei dir sicher, ich brauche insgesamt ca.600 Label, aber Aufgrund der momentanen Performance, kann ich mit nur 400 arbeiten.

Die 30000 nehme ich als Richtwert, da vergleichbare Programme dies angeblich verabeiten.
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 12. Mai 2005, 16:16
1. mal sollte Sharky's Post viel zeit sparen ...
Und 2. falls du deine 81 (?) Label's zur Laufzeit erstellst oder gar des öfteren befüllst könntest du sie ja in ein array of TLabel stecken. sollte auch n bissl helfen ....

[EDIT]
Zitat von Hallo_Thomas:
ich brauche insgesamt ca.600 Label,
ARRAY lässt grüßen
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:07 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