Delphi-PRAXiS
Seite 3 von 4     123 4   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TTreeView komige Speedprobleme... (https://www.delphipraxis.net/162532-ttreeview-komige-speedprobleme.html)

DelTurbo 28. Aug 2011 12:59

AW: TTreeView komige Speedprobleme...
 
Zitat:

Zitat von Alaitoc (Beitrag 1119985)
wie vll. sogar Servicepacks oder sonstige Updates, wer weiß?

Genau darum geht es. Ich dachte das sowas schonmal einer hatte. Dann hätte ich gezielt suchen können. Es hat ja im grunde nichts mit dem eigentlichen TreeView zu tun. Es ist mir da halt nur aufgefallen. Es kann ja sein das noch andere sachen betroffen sind.

Ich hätte auf Kaspersky getippt. Aber der ist das nicht.

mschaefer 28. Aug 2011 13:06

AW: TTreeView komige Speedprobleme...
 
Sachte - erstmal ´nen Tee:

Du gibtst eine VM Zeit an von 17s und eine VM-Host-Zeit von knapp 1 min an und fragst danach was das Füllen so verlangsamt.
Wenn die VM schneller läuft alsder VM-Host, dann ist das kein TreeView Problem. Deutet auf ein heftiges Systemproblem, Prozesse, Treiber, Hardware, hin (oder Zahlentausch). Du hast selbst geschreiben, dass Du das eventuell neu aufsetzen willst (gute Idee).

Die technsichen Macken, aus #18, schlagen zum Teil auch beim Caching zu und dann sind Hardwareproblem auch da die Ursache, wenn es nur aus der StringList kommt. Würde zum Speedtest den Treeview in einer For-Next-Schleife mit dem gleichen String füllen.

Mein Fazit:

- Wenn die Zahlen aus #1 stimmen ist, solltest Du das System neu aufsetzen.
- klären was wirklich angezeigt werden muß.
- VirtualTreeView nehmen

Schönen Sonntag noch!

Bjoerk 28. Aug 2011 13:08

AW: TTreeView komige Speedprobleme...
 
Ich habe mal zum Vergleich eine ListBox getestet und war doch einigermaßen erstaunt, daß das TreeView (ohne Images) genaus so schnell ist wie diese. Scheint ein Aberglaube zu sein, daß TreeView stinklangsam ist. Auf jeden Fall auch viel schneller als ein Memo, aber das denke ich, ist klar.

Delphi-Quellcode:
procedure GetDirs(const Start: String; const SL: TStrings);
var
  S: TSearchRec;
  P: string;
  R: integer;
begin
  R:= FindFirst(Start+'*.*', faDirectory, S);
  while R = 0 do
  begin
    if ((S.Attr and faDirectory) <> 0) then
      if ((S.Name <> '.') and (S.Name <> '..')) then
      begin
        P:= Start+S.Name+'\';
        SL.Add(P);
        GetDirs(P, SL);
      end;
    R:= FindNext(S);
  end;
  Findclose(S);
end;


procedure GetNodeDirs(const ADirectory: String; var ATree: TTreeView; const Start: TTreeNode);
  function SlashSep(const Path, S: String): String;
  begin
    if AnsiLastChar(Path)^ <> '\' then
      Result:= Path+'\'+S
    else
      Result:= Path+S;
  end;
var
  S: TSearchRec;
  N: TTreeNode;
  R: integer;
begin
  R:= FindFirst(SlashSep(ADirectory, '*.*'), faDirectory, S);
  while R = 0 do
  begin
    if ((S.Attr and faDirectory) <> 0) then
      if ((S.Name <> '.') and (S.Name <> '..')) then
      begin
        N:= ATree.Items.AddChild(Start, S.Name);
        GetNodeDirs(SlashSep(ADirectory, S.Name), ATree, N);
      end;
    R:= FindNext(S);
  end;
  Findclose(S);
end;


procedure TForm1.Button1Click(Sender: TObject); // ListBox
var
  fPath: string;
  fTime: Cardinal;
begin
  fPath:= 'C:\';
  ListBox1.Items.Clear;

  fTime:= GetTickCount;
  ListBox1.Items.BeginUpdate;
  GetDirs(fPath, ListBox1.Items);
  ListBox1.Items.EndUpdate;

  Label1.Caption:= IntToStr(GetTickCount-fTime);
end;


procedure TForm1.Button2Click(Sender: TObject); // TreeView
var
  fPath: string;
  fTime: Cardinal;
begin
  fPath:= 'C:\';
  TreeView1.Items.Clear;

  fTime:= GetTickCount;
  TreeView1.Items.BeginUpDate;
  GetNodeDirs(fPath, TreeView1, TreeView1.Items.AddChild(Nil, fPath));
  TreeView1.Items.EndUpDate;

  Label2.Caption:= IntToStr(GetTickCount-fTime);
end;


procedure TForm1.Button3Click(Sender: TObject); // StringList
var
  fPath: string;
  fTime: Cardinal;
  SL: TStringList;
begin
  fPath:= 'C:\';
  SL:= TStringList.Create;

  fTime:= GetTickCount;
  GetDirs(fPath, SL);
  Label3.Caption:= IntToStr(GetTickCount-fTime)+' ('+IntToStr(SL.Count)+')';

  SL.Free;
end;

Alaitoc 28. Aug 2011 13:14

AW: TTreeView komige Speedprobleme...
 
Sobald man bei Delphi mehrere Einträge für ne TreeView hat, sollte man lieber auf die Alternative VirtualTreeview wechseln. Keine Ahnung wie sie im Vergleich zu anderen Standard-Delphi Komponenten steht, jedoch ist sie im Vergleich zu der VirtualTreeview Alternative deutlich langsamer.

Das hatte ich ja schon bei meiner eigenen TTreeview-Dropdown-Komponente gemerkt (welche auf TTreeview basiert) dass es da relativ schnell zu Performance Einbußen kommt.

Falls du wirklich die Ursache herausfinden willst kannste ja mal alles nach und nach von deinem Rechner werfen *g*

MfG Alaitoc

Edith sagt: Ebenfalls einen schönen Sonntag ;)

wicht 28. Aug 2011 15:19

AW: TTreeView komige Speedprobleme...
 
Auch wenn der Thread jetzt vielleicht "vorbei" ist möchte ich noch meine Meinung schreiben. Ersteinmal muss ich mschaefer beipflichten - wenn etwas auf ein und dem selben PC in der VM schneller läuft, als auf der realen Hardware, kann irgendetwas nicht stimmen. Vielleicht wirklich neu aufsetzen.
Dazu kommt noch, dass ich das TTreeView nur bei Dingen einsetze, die nur wenige Einträge haben. Es ist nicht nur langsam, teilweise gibt es auch ein lustiges Flackern, wenn man die Maus über die Einträge bewegt. Ab und an verschwinden auch die Header (Spalten-Überschriften). TTreeView benutze ich selber nur für Darstellungen, die wenige Einträge haben und nicht die ganze Zeit sichtbar sind (wegen den Flackereffekten - z.B. nutze ich TTreeView/TListView in Einstellungsfenstern) - ansonsten setze ich an allen anderen Stellen auf TVirtualTreeView, das ist einfach DIE Komponente, um Listen oder Bäume darzustellen. Man muss sich zwar etwas einarbeiten, aber dafür bietet die Komponente fast unzählbare Möglichkeiten.
Danke, Herr Mike Lischke!

ChrisE 29. Aug 2011 08:59

AW: TTreeView komige Speedprobleme...
 
Hallo,

vielleicht hast du schon eine Lösung des Problems, dennoch habe ich ein zwei Anmerkungen, die ich hier auch noch anbringen möchte:

- Deine VM hat u.U. nicht die selbe Anzahl an Items wie Dein Hostsystem.

Zitat:

Zitat von DelTurbo (Beitrag 1119987)
Wobei ich denke das es egal ist ob ich 10.000 oder 100.000 Items hinzufüge

- Es dauert sehr wohl länger 100.000 Einträge zu erzeugen gegenüber 10.000 (nämlich im einfachsten Fall genau um den Faktor 10) - da der Code der zum hinzufügen ausgeführt werden muss ja 10 mal häufiger durchlaufen wird.

Bezogen auf Deine Frage, warum es langsamer ist auf System A zu B würde ich somit das naheliegenste Wählen: Ich denke tatsächlich, dass der Geschwindigkeitsunterschied daher kommt, dass die gesamte Anzahl an Items sich in Host und VM unterscheiden.

Gruß, Chris

BTW:
Zitat:

Zitat von DelTurbo (Beitrag 1119987)
Und eigentlich sollte es doch auch egal sein wie. Da ich immer die gleiche .exe zum messen nehme. Oder irre ich mich???

Das es absolut betrachtet Egal ist wie man einfügt glaube ich nicht spricht z.B. der Unterschied mit BeginUpdate und ohne. Relativ betrachtet - sprich immer die selbe exe - hast du sicher recht. Allerdings ist hier auch die Frage, wie stark das OS "Programmiereigenarten" kappselt / verbessert / verschlechtert. Ein XP geht mit machen Dingen sehr wohl anders um als z.B. ein Windows 7. Die selbe EXE kann sich dann auf zwei Systemen unterschiedlich verhalten und unterschiedliche Performance zeigen.

Luckie 29. Aug 2011 09:34

AW: TTreeView komige Speedprobleme...
 
Zitat:

Zitat von DelTurbo (Beitrag 1119970)
Zitat:

Zitat von Luckie (Beitrag 1119956)
Also wenn du die Anzahl der zu erst erstellten Einträge reduzierst, solltest du auch auf dem langsamen Rechner gute Zeiten bekommen. Und warum es langsamer ist? Andere Hardware (weniger RAM, ...) oder es laufen einfach mehr Prozesse, so dass dein Prozess weniger Rechenzeit bekommt. Da kann es ein paar Gründe geben. Aber was willst du bei einem Kunden/Benutzer machen? Willst du ihm sagen, er soll Windows neu installieren und keine weiteren Programm außer deinem?

Also optimiere das ganze, so dass erst mal nur die wirklich benötigten Einträge gemacht werden und die weiteren erst bei Bedarf.

Nochmal sorry. Aber würdest du mal richtig lesen, dann würdest du feststellen das ich das auch auf der gleichen Hardware getestet habe (Post #6).

Im ersten Posting redest du aber noch von einer VM:
Zitat:

Lasse ich das in einer VMWare auf dem selben rechner laufen, ist die dauer ~17 Sekunden.
Und das ist ein zweiter Rechner. Oder hat die VM zum Beispiel genauso viel Arbeitsspeicher wie das Hostsystem? In der VM ist ein zweites Windows installiert. Ich glaube kaum, dass dieses exakt identisch ist mit der installierten Software, laufenden Diensten, Autorun-Programmen wie das Windows vom Hostsystem. Also haben wir es defakto mit zwei unterschiedlichen Rechnern zu tun und zwar was so wohl die Hardware als auch die Software angeht.

DelTurbo 29. Aug 2011 11:22

AW: TTreeView komige Speedprobleme...
 
Hmm, ich fang einfach mal der reihe nach zu antworten.

Zitat:

Zitat von mschaefer (Beitrag 1119990)
Die technsichen Macken, aus #18, schlagen zum Teil auch beim Caching zu und dann sind Hardwareproblem auch da die Ursache, wenn es nur aus der StringList kommt. Würde zum Speedtest den Treeview in einer For-Next-Schleife mit dem gleichen String füllen.

Wenn du Post #6 gelesen hättest würdest du nicht sagen das es ein Hardware prob ist.

Zitat:

Zitat von wicht (Beitrag 1120006)
Auch wenn der Thread jetzt vielleicht "vorbei" ist möchte ich noch meine Meinung schreiben. Ersteinmal muss ich mschaefer beipflichten - wenn etwas auf ein und dem selben PC in der VM schneller läuft, als auf der realen Hardware, kann irgendetwas nicht stimmen.

Richtig. Aber nicht Hardwareseitig sondern am Windows selber. Ich wollte auch nur wissen ob das schonmal einer hatte.

Zitat:

Zitat von ChrisE (Beitrag 1120071)
- Deine VM hat u.U. nicht die selbe Anzahl an Items wie Dein Hostsystem.

Logischerweise werde immer die gleichen daten gelesen. Wie will man sowas sonst testen? Auf einem System mit 2 einträgen arbeiten, auf dem anderen mit 100.000 und dann sagen "Hui, da stimmt aber was nicht".

Zitat:

Zitat von ChrisE (Beitrag 1120071)
- Es dauert sehr wohl länger 100.000 Einträge zu erzeugen gegenüber 10.000 (nämlich im einfachsten Fall genau um den Faktor 10) - da der Code der zum hinzufügen ausgeführt werden muss ja 10 mal häufiger durchlaufen wird.

[ironie_on] Das wusste ich garnicht. [ironie_off]

Zitat:

Zitat von Luckie (Beitrag 1120072)
Im ersten Posting redest du aber noch von einer VM:
Zitat:

Lasse ich das in einer VMWare auf dem selben rechner laufen, ist die dauer ~17 Sekunden.
Und das ist ein zweiter Rechner. Oder hat die VM zum Beispiel genauso viel Arbeitsspeicher wie das Hostsystem? In der VM ist ein zweites Windows installiert. Ich glaube kaum, dass dieses exakt identisch ist mit der installierten Software, laufenden Diensten, Autorun-Programmen wie das Windows vom Hostsystem. Also haben wir es defakto mit zwei unterschiedlichen Rechnern zu tun und zwar was so wohl die Hardware als auch die Software angeht.

Das mit der VM war ein Beispiel. Zumal eine VM langsamer ist als der Host. Jenachdem was man macht. Logischerweise. Die muss z.b. die NIC, IDE, SCSI usw. emulieren.
Leider muss ich auch dich auf Post #6 verweisen.

Nochmal, es ging im grunde "nur" um die frage ob sowas schonmal jemand hatte. Warum ich hier in dem Forum frage, und nicht woanders? Weil ich dachte, hier braucht man nicht zu erklären was ein TTreeView ist, und was der macht.

In Delphifragen wurde mir hier auch immer sehr nett und schnell geholfen. Auch wenn es mal eine "dumme" frage war, weil ich den Wald vor lauter Bäumen nicht sah.

Trotzdem danke ich allen die versucht haben zu helfen. :thumb:

Auch wenn das eigentliche Thema verfehlt wurde. Sowas kann einfach passieren. Wir sind alle "nur" menschen.

ChrisE 29. Aug 2011 11:48

AW: TTreeView komige Speedprobleme...
 
Zitat:

Zitat von DelTurbo (Beitrag 1120098)
Zitat:

Zitat von ChrisE (Beitrag 1120071)
- Es dauert sehr wohl länger 100.000 Einträge zu erzeugen gegenüber 10.000 (nämlich im einfachsten Fall genau um den Faktor 10) - da der Code der zum hinzufügen ausgeführt werden muss ja 10 mal häufiger durchlaufen wird.

[ironie_on] Das wusste ich garnicht. [ironie_off]

;-) Danke dir für die Ironie - aber vielleicht sollte ich Dich auf Deine Posts verweisen: In #6 behauptests du, dass genau das egal ist. Und da du nie gepostet hast dass die Daten tatsächlich absolut Identisch sind, ist das auch nicht logisch - sondern eher eine mögliche Fehlerquelle (siehe folgenden Satz)
Zitat:

Zitat von DelTurbo (Beitrag 1120098)
Logischerweise werde immer die gleichen daten gelesen. Wie will man sowas sonst testen? Auf einem System mit 2 einträgen arbeiten, auf dem anderen mit 100.000 und dann sagen "Hui, da stimmt aber was nicht".

Die "Themaverfehlung" Deiner Helfer hier hat sicher manchmal etwas mit überlesen zu tun, aber man sollte auch so weit reflektieren, ob die Helfer die vollständigen Informationen haben um helfen zu können. Niemand weiß genau was Du als Fragender als Logisch voraussetzt und was nicht. Es wird nicht versucht irgendwelche Glaskugelposts zu produzieren und Dir statt dessen zu helfen. Damit wird etwas im trüben gefischt und vielleicht tatsächlich am Thema vorbei gepsorchen - aber das ist meines Erachtens nicht ausschließlich das Versäumnis der Helfer.

In einer Sache stimme ich Dir aber dennoch voll und ganz zu
Zitat:

Zitat von DelTurbo (Beitrag 1120098)
Wir sind alle "nur" menschen.

Gruß, Chris

DelTurbo 29. Aug 2011 12:04

AW: TTreeView komige Speedprobleme...
 
Zitat:

Zitat von DelTurbo (Beitrag 1119897)
Hi,
also es sind 54.279 Items. Hinzugefügt werden sie aus diesem Post. http://www.delphipraxis.net/1118455-post9.html Ich habe den link von Lannes genommen, der mir netterweise an dieser stelle geholfen hat.

Wobei ich denke das es egal ist ob ich 10.000 oder 100.000 Items hinzufüge. Und eigentlich sollte es doch auch egal sein wie. Da ich immer die gleiche .exe zum messen nehme. Oder irre ich mich???

Wenn ich mein "SpieleSystem" boote sind die in ~14 Sek. drinn. Mehr als 4x so schnell. Und das mit der gleichen .exe auf der gleichen Hardware.

huhu, les dochmal genau. Da steht es werden 54.279 Items eingetragen. Und das es auf dem System 4x langsamer ist. Es wäre auch bei 1.000.000 4x langsamer. Aber ich gebe zu, der mittlere satz ist nicht gut formuliert. Da hätte stehen müssen, das ich die gleiche .exe und die gleichen daten nehme. Aber das hatte ich wohl vorraus gesetzt das es logisch ist das ich immer die gleichen daten nehme.

Das das hier soooo schief gelaufen ist, nehme ich keinem übel. Ich glaube das habe ich in meinem letzten Post deutlich zum ausdruck gebracht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 Uhr.
Seite 3 von 4     123 4   

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