首先,我正在回答我自己的问题 Q/A 风格,所以我不一定需要任何人来回答这个问题。这是我学到的东西,很多人都可以利用它。
我有一个由许多不同节点组成的树视图。每个节点在其Data
属性中都有一个对象,并且这些对象引用来自一个对象主列表的不同层次结构,该主列表非常大(数千个项目)。一个节点表示该主要列出对象上的特定属性,其中树允许用户选择一个节点以查看属于该特定选定类别的那些项目。
当树被填充时,它变得非常耗时(在某些情况下需要 2 分钟),因为每个节点都需要遍历这个大列表中的每个项目并找到这个列表中属于任何给定节点的每个项目。因此,如果这棵树中有 500 个节点,那么它将遍历这个大列表 500 次。共有 3 级层次结构 - 加载第二级和第三级时会出现性能阻塞,但第一级简单快捷。
现在没有任何选项可以提高迭代此列表数百次的性能。我想知道是否有任何已知的技巧可以提高填充树视图的性能?
以下是它目前的工作方式:
var
X: Integer;
N: TTreeNode;
O: TMyObject;
begin
for X := 0 to MyObjectList.Count - 1 do begin
O:= TMyObject(MyObjectList[X]); //Object which Node represents
N:= TreeView.Items.AddChild(nil, O.Caption);
N.Data:= O;
LoadNextLevel(N); //Populates child nodes by iterating through master list again
end;
end;
每个附加级别都有类似的方法。
PS - 第一级层次结构是从它自己的单独列表(大约 50 个对象)中填充的,而第二和第三级是从主列表中数千个对象的属性中填充的。这就是为什么第一级加载速度很快,其余的加载速度很慢。