2008. február 2., szombat

Optimization of work with standard TTreeView/TListView components


Problem/Question/Abstract:

Have a bad performance with standard TTreeView/TListView? Read this tip and implement the hints...

Answer:

If you uses the TTreeView and/or TListView from Win32 page of default component palette, then you must know that if you have the large amount nodes, you have a very bad performance...

Of course, at same moment you'll try to find a some other third-party component that allow to work with your very large data but I want to give you the few hints which allows to increase a performance without any third-party components. Only using of optimized code.

Tip1:

if you need add a lot of nodes in same time (for example, after button click to load the 10000 nodes in tree from some source) then you must call:

yourTreeView.Items.BeginUpdate;

yourTreeView.Items.EndUpdate;

This constuction will disable a repainting when you append the nodes - it's save a lot of time!

Tip2:

if you uses the some navigation by nodes, you must use the GetFirst and GetNext methods instead Items[i] using!

For example:

var
  node: TTreeNode;
begin
  node := yourTreeView.Items.GetFirstNode;
  repeat
    node := Result.GetNext;
  until node = nil;
end;

It's save a lot of time too! The GetFirstNode/GetNext is faster than standard

for i := 0 to yourTreeView.Items.Count - 1 do
begin
  node := yourTreeView.Items[i];
end;

Tip3:

Also, when adding lots of items, you could do

MyObj.AllocBy := 10000;

This will cause fewer allocations as it allocates more items each time.

For example, in own warehouse system I have a treeview with 5000 nodes which I load from Oracle resultset. After applying of these tips, the time of execution of procedure with append was decreased from 4-5 minutes to 15-20
seconds! Trust me :-)

I don't sure but I think that it's a bad work of Borland when team developed the envelope for Win's treeview/listview. But maybe I'm wrong.

PS: of course, if you have a very-very large data with few billions of nodes or after applying of tips above all the same you have a bad performance, you must use the virtual mode of control or really select the other third-party
control. But I suggest to change the your interface logic - to navigate thru few billions of nodes in same time is very hard task for user! Not only for you :-)

Nincsenek megjegyzések:

Megjegyzés küldése