【问题标题】:Performance of accessing dataSet fields using Field-names instead of indexes使用字段名而不是索引访问数据集字段的性能
【发布时间】:2011-08-13 15:05:32
【问题描述】:

性能可以忽略不计吗?

例如,

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

案例: 包含大量字段的表格,例如 > 50 个字段

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

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

【问题讨论】:

    标签: performance delphi dataset


    【解决方案1】:

    这是 François Gaillard 关于FieldByName performance issues 的有趣帖子。

    【讨论】:

    • 我希望有一个代码样式检查工具,用于像 Delphi IDE 中那样的低效代码(类似于 FxCop)...
    • 有CodeHealer,但我没用过:socksoftware.com/codehealer.php
    【解决方案2】:

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

    1. 只使用一次 ['FieldName'] 或 FieldByName() 语法,并将对该字段的引用存储在变量中。
    2. 使用"static" 持久字段声明,右键单击数据集,选择字段编辑器并添加所需字段。它将声明正确的 TField 后代,并让您指定名称。

    此外,AsXXXXXX 调用可能比使用 TField 后代原生 Value 属性慢。

    【讨论】:

    • 你确定.Value.As[Type] 快吗? IIRC,.Value 是变体类型属性,而 .As[Type] 是更有效的类型特定属性。 .Value更方便。
    • 顺便说一句:“持久性字段”是您正在寻找的术语... ;-)
    • ['Fieldname'] 语法不返回字段而是返回字段的值,因此不能用于存储对字段的引用。
    • @Jørn:值是 TField 后代中的本机类型。但是,性能取决于它的内部实现方式,它可以调用字段类型 AsXXXX 的相同函数(IIRC VCL 执行此操作)或反之亦然(其他库以这种方式工作)。你说得对,“持久”是正确的术语。 @dummzeuch:正确,这是我从未使用过并忘记的语法。
    【解决方案3】:

    我发现 FieldByName 明显变慢了。

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

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

    【讨论】:

    • 在这种情况下,存储对 TField 对象的引用可能比存储其索引更快。
    猜你喜欢
    • 2020-02-25
    • 2021-06-13
    • 1970-01-01
    • 2018-10-26
    • 2021-12-22
    • 2014-07-03
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多