在DataTable
对象中,按名称thisRow("ColumnA")
而不是按列索引thisRow(0)
查找列值是否会增加开销?在何种情况下,这可能是一个问题。
我在一个有大量VB6代码编写经验的团队工作,我注意到没有为DataTable
对象或数据网格按名称进行列查找。即使在.NET代码中,我们也使用一组整数常量来引用这些类型的对象中的列名。我问我们的团队领导为什么会这样,他提到在VB6中,根据列名而不是索引查找数据有很多开销。对于.NET来说仍然是这样吗?
示例代码(在VB.NET中,但同样适用于C#):
Public Sub TestADOData()
Dim dt As New DataTable
'Set up the columns in the DataTable '
dt.Columns.Add(New DataColumn("ID", GetType(Integer)))
dt.Columns.Add(New DataColumn("Name", GetType(String)))
dt.Columns.Add(New DataColumn("Description", GetType(String)))
'Add some data to the data table '
dt.Rows.Add(1, "Fred", "Pitcher")
dt.Rows.Add(3, "Hank", "Center Field")
'Method 1: By Column Name '
For Each r As DataRow In dt.Rows
Console.WriteLine( _
"{0,-2} {1,-10} {2,-30}", r("ID"), r("Name"), r("Description"))
Next
Console.WriteLine()
'Method 2: By Column Name '
For Each r As DataRow In dt.Rows
Console.WriteLine("{0,-2} {1,-10} {2,-30}", r(0), r(1), r(2))
Next
End Sub
是否存在方法2比方法1提供性能优势的情况?
发布于 2010-04-13 10:10:06
是,应该有一个连接到按名称而不是按索引查找列的轻微开销。我不会担心这个问题,除非您一直在循环中查找同一列,就像在代码示例中一样。因为根据表的行数,轻微的开销可能会累积到可测量的开销。
访问特定列的某一行的值的最快方法是使用DataColumn
对象本身进行查找。例如:
Dim dt As DataTable = ...
Dim idColumn As DataColumn = dt.Columns("ID")
Dim nameColumn As DataColumn = dt.Columns("Name")
Dim descriptionColumn As DataColumn = dt.Columns("Description")
For Each r As DataRow In dt.Rows
' NB: lookup through a DataColumn object, not through a name, nor an index: '
Dim id = r(idColumn)
Dim name = r(nameColumn)
Dim description = r(descriptionColumn)
...
Next
最后一条建议:,我强烈建议您不要使用数字索引!它使您的代码更加脆弱,也更难理解和维护:一旦列的逻辑顺序发生变化,您就需要相应地调整代码,可能在几个地方(而且您可能很容易地监视其中的一个,从而导致错误)。如果使用列名或DataColumn
对象本身进行查找,则可以更改列的顺序,而不必更改其余代码。
发布于 2010-04-13 10:30:11
事实是
如果名称查找区分大小写,则
因此,按索引进行检索肯定是最有效的,但这有关系吗?
在我的机器上做一些基本的(读幼稚的)测试,我发现使用上述索引机制访问一列的1,000,000次需要花费以下时间
109.11ms
因此,根据您的情况,您可以得出您的结论。
发布于 2010-04-13 10:10:20
是的,按名称(而不是绝对索引)查找列会带来开销(因为它只是定位列,然后以这种方式访问它)。
尽管如此,这是相当不成熟的优化。DataTable
将首先尝试以区分大小写的方式定位列,这是非常快速的。如果它不能这样定位列,它就会以一种不区分大小写的方式出现,这只会稍微慢一些。
访问数据的绝对最快的方式是通过DataColumn
对象本身,因为这是基于索引和基于名称的访问器所使用的。
https://stackoverflow.com/questions/2631951
复制