使用字段名而不是索引访问dataSet字段的性能

时间:2011-04-27 07:16:40

标签: performance delphi dataset

性能是否可以忽略不计?

例如,

myQuery.FieldbyName("MyField").AsString;
myQuery.Fields[0].AsString;

例: 具有相当数量字段的表,例如> 50个字段

访问大型结果集,例如> 100,000行

字段名称的可读性好处是否值得降低性能?

3 个答案:

答案 0 :(得分:6)

以下是FrançoisGaillard关于FieldByName performance issues的一篇有趣的文章。

答案 1 :(得分:4)

效果可能不会可以忽略不计,具体取决于您按名称访问字段的频率。如果您将它用于每个字段和每一行,您可能会注意到性能下降(例如,参见http://www.delphifeeds.com/go/s/74559)。为了保持可读性而又提高性能,你可以:

  1. 仅使用 ['FieldName']或 FieldByName()语法一次,并在变量中存储对该字段的引用。
  2. 使用“static”持久字段声明,右键单击数据集,选择“字段编辑器”并添加所需字段。它将声明正确的TField后代,并让您指定一个名称。
  3. AsXXXXX调用也可能比使用TField后代本机Value属性慢。

答案 2 :(得分:1)

我发现FieldByName要慢得多。

我通常通过中间层访问数据库,该中间层可以从同一个表中多次访问整个记录。在创建该层时,我将每个字段的索引分配给变量。然后我使用这些变量进行后续访问,仍然具有可读代码。

ADODataSet.CommandText := 'select * from [TABLE] where 1 = 0'; //table layout
ADODataSet.Open;
ADODataSet.GetFieldNames(List);
varMyField := List.IndexOf('MyField');