2012-02-07 43 views
0

我在C#,winform和Mysql中工作。 (Visual Studio 2010)。如何在c#中查找編碼執行時間?

在我的項目中,所有menutrip項目都是不可見的。在登錄時可以看到哪些菜單項用戶權限。對於我看不見所有菜單條。我編碼可見的菜單項。

但它需要太多的時間。超過5分鐘。所以我有幾個問題。

  1. 我怎麼找到這個編碼執行時間? (我的代碼如下)....
  2. 是否有任何特殊工具?
  3. 如何使用有效的代碼來縮短時間?
private void menuActive(ToolStripItemCollection items) 
     { 
      hp.getConnStr(); 
      MySqlConnection connection = new MySqlConnection(hp.myConnStr); 
      MySqlCommand command = connection.CreateCommand(); 
      MySqlDataReader Reader; 
      command.CommandText = "select menu_key from mcs_menu_rights where userid ='"+userId+"'"; 
      connection.Open(); 
      Reader = command.ExecuteReader(); 
      while (Reader.Read()) 
      { 
       foreach (ToolStripMenuItem item in items) 
       { 
        if (item.Name == Reader[0].ToString()) 
        { 
         item.Visible = true; 
        } 
        else 
        { 
         menuActive(item.DropDown.Items); 
        } 
       } 
      } 
      connection.Close(); 
     } 
+0

做到這一點的一種方法是使用稱爲分析器的工具。有許多.NET可用。 – Jason 2012-02-07 13:47:15

+2

應該這個代碼甚至工作?你正在遞歸地調用函數,而SqlDataReader仍然是打開的... – 2012-02-07 13:49:24

+0

@zach,他創建了多個讀取器和連接,如果sql server支持多個連接,它就會工作得很好。 – hcb 2012-02-07 13:54:16

回答

3

你可以配置文件,但也有一些明確的改進,我可以看到直客:

單獨出你recusive功能從數據庫中查詢了。這樣您可以查詢數據庫一次。請注意,它並沒有完全一樣,但我不確定那張表是什麼樣的,所以你必須測試它。

private void menuActive(ToolStripItemCollection items) 
    { 
     hp.getConnStr(); 
     MySqlConnection connection = new MySqlConnection(hp.myConnStr); 
     MySqlCommand command = connection.CreateCommand(); 
     MySqlDataReader Reader; 
     command.CommandText = "select menu_key from mcs_menu_rights where userid ='"+userId+"'"; 
     connection.Open(); 
     Reader = command.ExecuteReader(); 
     while (Reader.Read()) 
     { 
      var nameFromDB = Reader[0].ToString(); 
      setMenuActiveByName(items, nameFromDB); 
     } 
     connection.Close(); 
    } 

    //This is the recursive bit, but doesn't re-enquire the database 
    private void setMenuActiveByName(ToolStripItemCollection items, string name) 
    { 
      foreach (ToolStripMenuItem item in items) 
      { 
       if (item.Name == name) 
       { 
        item.Visible = true; 
       } 
       else 
       { 
        setMenuActiveByName(item.DropDown.Items, name); 
       } 
      } 
    } 
+1

謝謝Weston。它的作品非常快。 – Sagotharan 2012-02-07 14:12:36

0

可以使用StopWatch class測試性能

StopWatch sWatch = new StopWatch(); 
sWatch.Start(); 
// Code comes here 
... 
sWatch.Stop(); 
// sWatch.Elapsed // Contains the time interval 

這似乎是你有一個壞遞歸那裏 - 你一遍又一遍運行在相同的收集功能。

0

根據您的VS版本,您可能可以使用內置的profiling tools來查找花費的時間。

0

對於問題1和問題2,您可以使用秒錶

Stopwatch watch = new Stopwatch(); 

watch.Start(); 
//YOUR CODE HERE 
watch.Stop(); 

Console.WriteLine("Elapsed: {0}",watch.Elapsed); 
1

是,創造了每一個菜單項的一個dBASE連接將需要一段時間。你需要避免在foreach循環中調用MenuActive()。一個小的輔助方法,使其更聰明:

private static bool EnableMenuItem(ToolStripItemCollection items, string name) { 
     foreach (ToolStripMenuItem item in items) { 
      if (item.Name == name) { 
       item.Visible = true; 
       return true; 
      } 
      else if (item.DropDown.Items.Count > 0 { 
       if (EnableMenuItem(item.DropDown.Items, name)) return true; 
      } 
     } 
     return false; 
    } 

,並調用它是這樣的:

 ... 
     while (Reader.Read()) 
     { 
      EnableMenuItem(items, Reader[0].ToString(); 
     } 
1

問題1和2

var time = TimeAction(() => 
    { 
     //CODE here 
    }); 

private static TimeSpan TimeAction(Action action) 
{ 
    var sw = new Stopwatch(); 
    sw.Start(); 
    action.Invoke(); 
    sw.Stop(); 
    return sw.Elapsed; 
} 

問題3

//One loop through all records in database 
while (Reader.Read()) 
{ 
    //Another loop through all the control 
    foreach (ToolStripMenuItem item in items) 
    { 
     if (item.Name == Reader[0].ToString()) 
     { 
      item.Visible = true; 
     } 
     else 
     { 
      menuActive(item.DropDown.Items); 
     } 
    } 
} 

鑑於您在數據庫和10個項目中有1000條記錄,這需要10 000次迭代,每次迭代都包括到數據庫的訪問以提供新數據。

+0

+1謝謝oleksii。 – Sagotharan 2012-02-07 14:13:56