【发布时间】:2016-10-29 10:24:31
【问题描述】:
如果并且可以执行 Cds.FieldByName('field').Value,向 TClientDataset 添加字段有什么意义?
有参考是不是更快? 是不是“更清楚”了?
【问题讨论】:
标签: delphi tclientdataset
如果并且可以执行 Cds.FieldByName('field').Value,向 TClientDataset 添加字段有什么意义?
有参考是不是更快? 是不是“更清楚”了?
【问题讨论】:
标签: delphi tclientdataset
问题
DataSet.FieldByName('field').Value
是一种表演。每次执行此操作时,都会对数据集的字段集合进行串行搜索,以找到具有所需名称的字段。此搜索未以任何方式优化,例如通过使用二进制搜索或散列算法。因此,如果有许多字段和/或您在迭代数据集中的记录时进行此访问,则可能会对性能产生重大影响。
这是使用对象检查器定义“持久”TFields 的一个原因,但不是唯一一个原因。您可以通过使用编译器已知的符号名称来获取对特定 TField 的引用,这只会在编译时发生一次。所以是的,它比FieldByName 快。看你是否觉得它更清楚了。
使用持久 TFields 的其他原因包括可以轻松设置计算字段,更重要的是,计算字段不需要通过 FieldByName 在 OnCalcFields 事件中访问.使用FieldByName 与持久字段的性能损失当然是乘以OnCalcField 事件中引用的字段数,并且OnCalcFields 至少为数据集中的每条记录调用一次,即使您不这样做在您自己的代码中迭代数据集记录。
上述情况适用于所有 TDataSet 后代,而不仅仅是 TClientDataSets。
【讨论】: