如何在c中找到编码执行时间
本文关键字:编码 执行时间 | 更新日期: 2023-09-27 18:23:51
我在C#、winform和Mysql中工作。(Visual Studio 2010)。
在我的项目中,所有菜单栏项都是不可见的。在登录时可以看到哪个菜单条项的用户权限。为此我看不见所有的菜单条,。我为可见的菜单条项目编码。
但这需要太多时间。超过5分钟。所以我有几个问题。
- 我如何找到这个编码执行时间?。(下面是我的代码)
- 有什么专用工具吗
- 如何使用有效的代码缩短时间
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(); }
您可以进行评测,但我可以直接看到一些明确的改进:
将回避函数从数据库查询中分离出来。通过这种方式,您可以查询数据库一次。注意,它并没有完全一样,但我不确定那个表是什么样子的,所以你必须测试它
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);