2012-03-17 16 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