如何在c中找到编码执行时间

本文关键字:编码 执行时间 | 更新日期: 2023-09-27 18:23:51

我在C#、winform和Mysql中工作。(Visual Studio 2010)。

在我的项目中,所有菜单栏项都是不可见的。在登录时可以看到哪个菜单条项的用户权限。为此我看不见所有的菜单条,。我为可见的菜单条项目编码。

但这需要太多时间。超过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();
        }

如何在c中找到编码执行时间

您可以进行评测,但我可以直接看到一些明确的改进:

将回避函数从数据库查询中分离出来。通过这种方式,您可以查询数据库一次。注意,它并没有完全一样,但我不确定那个表是什么样子的,所以你必须测试它

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); 
                } 
            }
    } 

是的,为每个菜单项创建数据库连接需要一段时间。您需要避免在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和问题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);
        }
    }
}

假设您在一个数据库中有1000条记录和10个项目,这需要10000次迭代,每次迭代都包括访问数据库以提供新数据。

使用StopWatch类为执行计时,http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx.记录每一步之后的时间,以确定是什么花费了这么长时间。

您可以使用StopWatch类来测试的性能

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

看起来你有一个糟糕的递归——你在同一个集合上一遍又一遍地运行函数。

根据VS的版本,您可能可以使用内置的评测工具来查找花费的时间。

对于问题1和2,您可以使用秒表

Stopwatch watch = new Stopwatch();
watch.Start();
//YOUR CODE HERE
watch.Stop();
Console.WriteLine("Elapsed: {0}",watch.Elapsed);