【问题标题】:RecordCount vs BOF/EOF evaluationRecordCount 与 BOF/EOF 评估
【发布时间】:2011-05-12 16:01:18
【问题描述】:

我正在维护一组代码,其中包含用于 SqlDataAdapter 的包装类以加载 System.Data.DataTable。它有一个通用函数来确定 DataTable 是否“hasRecords”。我知道这是一个小问题,但出于好奇……哪种方法使用起来更快?

现有:

    Public ReadOnly Property hasRecords() As Boolean
        Get
            hasRecords = CBool((CBool(BOF = True) And CBool(EOF = True)) = False)
        End Get
    End Property

或 可能的新:

    Public ReadOnly Property hasRecords() As Boolean
        Get
            hasRecords = IIf(RecordCount > 0, True, False)
        End Get
    End Property

如果 RecordCount 被定义为记录集属性中的固定值,我认为作为单个 eval 与它使用的多部分转换/eval BOF/EOF 方法相比,计数会更快。

还有什么不改的理由吗?

【问题讨论】:

  • 我们在说什么类型?你提到了记录集和数据集。
  • 一个小小的挑剔,但假设 BOF 和 EOF 是布尔值,hasRecords = CBool​​((CBool​​(BOF = True) And CBool​​(EOF = True)) = False) 可以重写为 hasRecords =不是(BOF 和 EOF)。此外,hasRecords = IIf(RecordCount > 0, True, False) 可以简单地为 hasRecords = (RecordCount > 0)。

标签: asp.net vb.net performance visual-studio-2008


【解决方案1】:

这似乎是一种不必要且有潜在风险的优化; RecordCount 可能并不总是可用(请参阅documentation),而 BOF 和 EOF 应始终返回适当的答案。因此,您的优化可能会破坏行为,同时可能只提供最小的性能回报(如果您真的对此感兴趣,您应该进行测试)。

【讨论】:

  • 感谢您的链接。可能会中断 - 几乎是我的想法。这不是“必须改变”,我没有触及它,因为“如果它没有坏,就不要修复它”。我知道性能提升非常小,但是当我偶然发现它时有点好奇,因为基本代码在 CBool​​s 中看起来很奇怪。
【解决方案2】:

就所涉及的算术而言,

hasRecords = Not(BOF AndAlso EOF)

hasRecords = (RecordCount > 0)

RecordCount 测试似乎更省力。然而,这将是一个幼稚的结论。您需要自己进行计时,看看是否有任何区别。我的大胆猜测:在今天的现代 CPU 上——通过流水线、分支预测和其他先进技术——可能不会有可测量的差异。


顺便说一句,虽然您可能会觉得 RecordCount 没问题,但我发现 BOF/EOF 更便携。只是说说而已。

【讨论】:

  • OTOH,也许 Not(EOF AndAlso BOF) 会执行得更快一些,因为对于任何至少有一行的给定表,EOF 为 False 的频率高于 True。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多