2012-03-17 32 views
0

我已经编写了一个代码,它可以像标题所说的那样执行操作。问题是,整个过程仅需要10分钟即可完成1000条记录。下面是代码:(在vb.net 3.5和SQL Server CE写的)用于检索xml表格数据的性能优化

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

Most likley _TableItem函数从数据库中读取计数...考虑将此函数的源添加到问题中。 – 2012-03-17 06:27:55

+0

_TableItem标记要提取的标签位置,innerText将提取子数据,我曾经考虑下载整个数据,并使用stringbuilder函数来完成这项工作。但是它怎么可以完成,它会帮助吗?也算是一个整数 – lkn2993 2012-03-17 07:42:07

+0

我的意思是价值函数将提取子内部的文字为字符串,我的不好。 – lkn2993 2012-03-17 07:49:17

回答

0

好吧,虽然我自己弄明白了,但我正在回答这个问题,关于其他人陷入同样的​​问题。

实际上,解决方案是使用for和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分钟的时间。请注意,该过程默认需要很长时间,因为项目内的记录非常大。

0

你需要测量和发现需要很长时间。 1000个项目10分钟是很长时间,所以应该很容易发现问题。使用秒表类是为了这样的测量。

请先尝试查看您的代码是否记录在记录数上 - 测量1-10-100-1000条记录。我期望你发现时间的非线性增长(O(n^2)至少)。

在“记录”对象上创建测量,而不是将数据发送到数据库,即通过简单地删除myReader.Insert()。

+0

非常奇怪,删除插入函数在整个过程中有一个零(以秒为单位)提升。这意味着插入功能本身很轻。 – lkn2993 2012-03-17 08:43:39

+0

最耗时的行是访问value属性的行,用常量字符串替换属性为我节省了7.5分钟(满分10)。现在,有无论如何缓存数组属性作为一个值或类似的东西(请注意,_TableItem数组本身并不耗时。) – lkn2993 2012-03-17 08:53:15

+0

你可以试试我的SqlCeBulkCopy库... http://sqlcebulkcopy.codeplex.com – ErikEJ 2012-03-17 10:26:21