【发布时间】:2011-07-18 03:28:35
【问题描述】:
*总结:
请查看 Delphi 专家的知识渊博的 cmets。特别是对我来说,我会尝试按照 David 的建议使用旧的 TList/TObjectList,并按照 A.Bouchez 的建议使用 hard-cast 和 TObjectList.List 属性。以后重构的时候会试试TDynArray。
================================================ =======================
假设我有一个TAtom 类,如以下代码中所定义。在运行时大约有 hundreds 到 thousands 的 TAtom 实例,目前为 stored in a dynamic array。在运行时,我需要对所有现有 TAtom 实例的 TAtom.X/Y/Z 进行简单的浮点数学运算,超过每秒 30 次。
现在,我需要在运行时添加 TAtom 实例的adding、inserting、deleting 的能力。看来我的选择是(1)请求一个大数组; (2)坚持动态数组,手动设置长度; (3) 切换到常规TList; (4) 切换到常规TObjectList。
除非有必要,否则我想避免 (1),因为我必须更改很多函数签名。 (2) 看起来也不好,因为 TList/TObjectList 似乎是为这项任务而生的。但是,因为需要使用常规 TList/TObjectList 进行类型转换,所以有人可以评论可能的性能损失吗?我的意思是,最好在我重写代码之前估计性能负担。如果性能会明显下降,我可以使用其他技术吗?
此外,我想知道使用 TList 和 TObjectList 之间是否存在性能差异?
TAtom = class
public
ElementZ: Integer;
X, Y, Z: Extended;
other variables: other types;
end;
TAAtom = array of TAtom;
【问题讨论】:
-
我的建议是测量它并亲自查看。
-
@Xichen Li,“删除”和“插入”操作将是所有 TList、TObjectList 和动态数组的最坏情况;如果你需要考虑性能,想办法跳过删除的惩罚,“投资回报率”会明显更高!
-
@Xichen Li,你需要随机访问数组中的任何元素吗?如果顺序访问就足够了,那么简陋的“链表”会更好地为您服务:它提供 O(1) 的插入、删除和追加。
-
@Xichen Li,我之前的评论推荐使用链表,因为它有 O(1) 的插入/删除/追加。其他想法包括不删除但用 nil 替换值(因此您不需要移动缓冲区)或用树替换整个数据结构:树可能能够更好地平衡随机访问的成本与成本插入和删除。当然,这一切都取决于你的工作量,只有你自己知道。
-
不,链表非常适合顺序访问,但不能用于随机访问。您需要完全放弃随机访问或接受使用它的非常高的惩罚(您需要遍历整个列表才能按索引获取记录)。
标签: arrays delphi tlist tobjectlist