2010-09-15 56 views
0

我在一個線程中有一些代碼。該代碼的主要功能是調用其他方法,它寫的東西到SQL數據庫這樣的:線程代碼執行時間緩慢上升。如何確定罪魁禍首?

private void doWriteToDb() 
    { 
     while (true) 
     { 
      try 
      { 
       if (q.Count == 0) qFlag.WaitOne(); 

       PFDbItem dbItem = null; 
       lock (qLock) 
       { 
        dbItem = q.Dequeue(); 
       } 
       if (dbItem != null) 
       { 
        System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); 
        //write it off 
        PFResult result = dbItem.Result; 
        double frequency = dbItem.Frequency; 
        int i = dbItem.InChannel; 
        int j = dbItem.OutChannel; 
        long detail, param, reading, res; 
        detail = PFCoreMethods.AddNewTestDetail(DbTables, _dicTestHeaders[result.Name.ToString().ToLower()]); 

        param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "Frequency"); 
        PFCoreMethods.AddNewTestParameterValue(DbTables, param, frequency.ToString()); 

        param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "In channel"); 
        PFCoreMethods.AddNewTestParameterValue(DbTables, param, i.ToString()); 

        param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "Out channel"); 
        PFCoreMethods.AddNewTestParameterValue(DbTables, param, j.ToString()); 

        param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "Spec"); 
        PFCoreMethods.AddNewTestParameterValue(DbTables, param, result.Spec); 


        dbItem.Dispose(); 
        dqcnt++; 
        sw.Stop(); 
       } 
      } 
      catch (Exception ex) 
      { 


      } 

     } 
    } 

的AddNewTestParameter方法是使用它具有SQL代碼的第三方類。目前我無法訪問其內部。

DbTables是一個集合對象,其屬性是由第三方程序創建的表對象。程序使用的只有一個DbTable對象。

問題是,隨着時間的推移(幾個小時),AddNewTestParameter方法調用花費的時間越來越長,從大約10ms開始到大約1sec。

q是包含寫入數據庫所需信息的對象的隊列。這些項目由主線程添加到此隊列中。線程只是把它們拿出來寫出來,然後把它們處理掉。 q.Count不超過1,儘管隨着數據庫寫入速度變慢,q.Count上升,因爲出隊無法趕上。最糟糕的是,q.Count超過了3萬。我總共向數據庫寫入了超過150,000個條目。

在SQL端,我在服務器上運行了一些跟蹤,並且跟蹤顯示內部SQL總是需要大約10ms,即使在C#代碼本身需要1秒的時間內。

所以,目前,我有2個疑慮:

  1. 我的代碼的問題。該線程是低優先級的,也許這可能會影響性能。另外,在觀看20分鐘的內存使用情況後,我看到它以約100K/min的速度上升,CPU利用率在%2-5左右似乎保持不變。我怎樣才能找出內存泄漏發生的地方?我可以將它指向代碼的特定部分嗎?

  2. 第三方代碼是問題。我怎麼能證明這一點?有什麼方法可以觀察並確認問題在於第三方代碼?

+0

使用內存分析器。 – 2010-09-15 15:18:12

回答

2

無論如何,如果我不得不做出一個建議,我想看看DBTables ...如果,也許是一個收集你忘了所以每次你怎麼稱呼它有一個更多的元素重新設置......所以經過一段時間的第三方例程,即O(n^2),或類似的東西,開始退化,因爲它預計最糟糕的情況下20桌子,你提供1000.

編輯:好的,我會放棄隊列中的問題,因爲出隊應該是一個非常快的操作(無論如何您都可以測量)。它仍然指向DBTables集合越來越大,您是否在第一次x迭代後檢查它的大小?

EDIT2:好,另一種方法,讓我們假設AddNewTestParameter不正是什麼是說,它不...添加隨後被添加到內部集合了新的參數。現在,有兩種選擇,如果是這種情況,要麼在每次迭代後調用「ClearParameters」函數來清除該集合,然後這將是你的錯,或者你沒有這樣的功能,然後它是第三代碼故障。這也可以解釋你的內存丟失(也可能與隊列增長有關)

+0

對不起,我做了一些編輯,希望清除一些混淆。 – sbenderli 2010-09-15 14:06:39

+0

DbTables是一個對象。它有8個屬性,每個屬性都指向一個表對象,它是第三方對象。我檢查過以確保我沒有創建新的DbTables,它始終是相同的DbTables對象。 – sbenderli 2010-09-15 14:35:06

相關問題