我已经编写了一个代码来完成标题所说的内容。问题是,整个过程只需要10分钟就可以获得1000条记录。这是代码:(用vb.net 3.5和sql server ce编写)
MyConnection.Open()
Dim count As UInt32
cmnd = New SqlCeCommand(sqlstring, MyConnection)
cmnd.CommandType = CommandType.TableDirect
myreader = cmnd.ExecuteResultSet(ResultSetOptions.Scrollable Or ResultSetOptions.Updatable)
myreader.ReadLast()
myreader.Read()
Dim i As UInt16
Do Until _TableItem(count) Is Nothing
record = myreader.CreateRecord()
For i = 0 To 20
record.SetString(i, _TableItem(count + i).value())
Next
myreader.Insert(record)
count += 21
Loop
MyConnection.Close()
如何优化此代码以获得更好的性能?
感谢。
答案 0 :(得分:0)
您需要测量并找到需要很长时间的事情。 1000件物品需要10分钟很长时间,因此应该很容易发现问题。使用秒表类进行此类测量。
首先尝试查看您的代码是否记录了记录的数量 - 测量1-10-100-1000条记录。我希望你能找到时间的非线性增长(至少是O(n ^ 2))。
测量“记录”对象的创建,而不是将数据发送到数据库,即只需删除myReader.Insert()。
答案 1 :(得分:0)
嗯,虽然我已经弄明白了,但我正在回答有关其他人遇到同样问题的问题。
实际上,解决方案是使用for和each case(c#switch)语句而不是do和for循环。代码看起来像:
For Each child as _TableItemChildNode in _TableItem
Select Case count
case 0
record = myreader.CreateRecord()
record.SetString(count, child.value())
count += 1
case 1 to 19
record.SetString(count, child.value())
count += 1
case 20
record.SetString(count, child.value())
myreader.Insert(record)
count = 0
End Select
Next
仅代码更改就节省了整整7分钟的时间。请注意,默认情况下该过程需要很长时间,因为项目内的记录非常大。