private void InitializeFunctionModule() { var parent = this.m_TreeView; var source = DBEntities.dbo.ModelInfo.ToList(); var array = new List<TreeNode>(); if (null == source) return; var data=source.Where(p => string.IsNullOrEmpty(p.ParentMDLName)); foreach (var entity in data) { TreeNode treeNode = new TreeNode(); treeNode.Tag = entity; treeNode.Text = entity.MDLName; InitializeFunctionModule(treeNode, entity, source); array.Add(treeNode); } parent.Nodes.AddRange(array.ToArray()); } private void InitializeFunctionModule(TreeNode parent, ModelInfo model, IEnumerable<ModelInfo> iEnumerable) { var source = iEnumerable.Where(p => p.ParentMDLName == model.MDLName); if (null == source) return; foreach (var entity in source) { TreeNode treeNode = new TreeNode(); treeNode.Tag = entity; treeNode.Text = entity.MDLName; InitializeFunctionModule(treeNode, entity, iEnumerable); parent.Nodes.Add(treeNode); } }
方法执行时间:1089毫秒
开发环境:VS 2010,Entity Framework 实体框架,Windows 窗体应用程序
方法作用:递归出“菜单”
问:方法执行时间过长,我该如何提升方法的执行效率。
我测试过直接使用“实体类+SQL命令”执行时间才 200毫秒
private void Form_Load(object sender, EventArgs e)
{
InitializeFunctionModule();
}
你这树有多少数据?
100条数据
@Me_Code: 你测试一下,加载一次,清空树,再加载一次。(不停下程序运行)
分别看看两次加载的时间。
@爱编程的大叔:
private void FormModelInfo_Load(object sender, EventArgs e)
{
InitializeFunctionModule();
this.m_TreeView.Nodes.Clear();
InitializeFunctionModule();
}
执行效率很慢
@Me_Code: 看看两个的时间。
@爱编程的大叔:
private void FormModelInfo_Load(object sender, EventArgs e)
{
long iTickcount = System.Environment.TickCount;
InitializeFunctionModule();
Console.WriteLine((System.Environment.TickCount - iTickcount).ToString());
iTickcount = System.Environment.TickCount;
this.m_TreeView.Nodes.Clear();
InitializeFunctionModule();
Console.WriteLine((System.Environment.TickCount - iTickcount).ToString());
}
执行时间:
876
15
@Me_Code: 博客园主的博文 来,给Entity Framework热热身
另外一个人的文章 Entity Framework 6 预热、启动优化
有时候碰到问题,回头看看书,理解了也就进步了。
更具体的话,其实你还应该测试一下数据加载的时间和树控件渲染的时间,
看看是不是主要由于EF未预热性能低造成的。不过你都说用MODEL+SQL会快了。
@爱编程的大叔:
看到晚上 1点钟,总算找到问题所在。
就是,ADO .NET 实体数据模型单独放在一个项目中。
关于预热这个问题,我还没研究明白,明天继续看。
谢谢大叔。
把 IEnumerable<ModelInfo> 改成 map。
@Launcher 怎么改
@Me_Code: 这代码不是你写的吗?
@Launcher: 不会 map 。
C#代码执行很快,哪怕用了递归,看你的描述,主要是慢在数据访问上,减少IO或者加上数据缓存可以明显提升性能。
一次性取出所有数据(菜单数据量也不多),加缓存,除了第一次略慢,后面跑起来就很快了。
如果你特别追求性能,既要占用时间少,又要占用空间少,不要依赖自动生成的SQL,自己写调优后的SQL是最佳选择。
@JeffWong
var source = DBEntities.dbo.ModelInfo.ToList();// 这里已经取出所有数据了。就访问了一次数据库
@Me_Code: 加上profile文本日志,精确到哪一步的具体耗时。仅仅看代码或者猜都是看不出来性能瓶颈的。
【if (null == source) return;】 这一句没有用
@上位者的怜悯:谢谢