首页 新闻 会员 周边 捐助

C# 如何优化我的代码

0
悬赏园豆:5 [已解决问题] 解决于 2015-07-16 11:04
        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();
}

Me_Code的主页 Me_Code | 初学一级 | 园豆:52
提问于:2015-07-15 17:01
< >
分享
最佳答案
0

你这树有多少数据?

收获园豆:5
爱编程的大叔 | 高人七级 |园豆:30844 | 2015-07-15 17:06

100条数据

Me_Code | 园豆:52 (初学一级) | 2015-07-15 17:07

@Me_Code: 你测试一下,加载一次,清空树,再加载一次。(不停下程序运行)

分别看看两次加载的时间。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-07-15 17:09

@爱编程的大叔:  

 private void FormModelInfo_Load(object sender, EventArgs e)
        {
            InitializeFunctionModule();
            this.m_TreeView.Nodes.Clear();
            InitializeFunctionModule();
        }

执行效率很慢

Me_Code | 园豆:52 (初学一级) | 2015-07-15 17:13

@Me_Code: 看看两个的时间。

private void FormModelInfo_Load(object sender, EventArgs e)
{
long iTickcount=system.environment.tickcount;
InitializeFunctionModule();
messagebox.show(system.environment.tickcount-iTickcount);
 
this.m_TreeView.Nodes.Clear();
iTickcount=system.environment.tickcount;
InitializeFunctionModule();
messagebox.show(system.environment.tickcount-iTickcount); }
爱编程的大叔 | 园豆:30844 (高人七级) | 2015-07-15 17:17

@爱编程的大叔: 

 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 | 园豆:52 (初学一级) | 2015-07-15 17:23

@Me_Code: 博客园主的博文 来,给Entity Framework热热身

另外一个人的文章 Entity Framework 6 预热、启动优化

有时候碰到问题,回头看看书,理解了也就进步了。

 

更具体的话,其实你还应该测试一下数据加载的时间和树控件渲染的时间,

看看是不是主要由于EF未预热性能低造成的。不过你都说用MODEL+SQL会快了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-07-15 17:27

@爱编程的大叔: 

看到晚上 1点钟,总算找到问题所在。

就是,ADO .NET 实体数据模型单独放在一个项目中。 

关于预热这个问题,我还没研究明白,明天继续看。

谢谢大叔。

Me_Code | 园豆:52 (初学一级) | 2015-07-16 01:44
其他回答(3)
0

把 IEnumerable<ModelInfo> 改成 map。

Launcher | 园豆:45050 (高人七级) | 2015-07-15 17:10

@Launcher 怎么改

支持(0) 反对(0) Me_Code | 园豆:52 (初学一级) | 2015-07-15 17:15

@Me_Code: 这代码不是你写的吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-07-15 17:24

@Launcher: 不会 map 。

支持(0) 反对(0) Me_Code | 园豆:52 (初学一级) | 2015-07-15 17:26
0

C#代码执行很快,哪怕用了递归,看你的描述,主要是慢在数据访问上,减少IO或者加上数据缓存可以明显提升性能。

一次性取出所有数据(菜单数据量也不多),加缓存,除了第一次略慢,后面跑起来就很快了。

如果你特别追求性能,既要占用时间少,又要占用空间少,不要依赖自动生成的SQL,自己写调优后的SQL是最佳选择。

JeffWong | 园豆:2328 (老鸟四级) | 2015-07-15 17:11

@JeffWong

var source = DBEntities.dbo.ModelInfo.ToList();// 这里已经取出所有数据了。就访问了一次数据库

支持(0) 反对(0) Me_Code | 园豆:52 (初学一级) | 2015-07-15 17:17

@Me_Code: 加上profile文本日志,精确到哪一步的具体耗时。仅仅看代码或者猜都是看不出来性能瓶颈的。

支持(0) 反对(0) JeffWong | 园豆:2328 (老鸟四级) | 2015-07-15 19:15
0

【if (null == source) return;】  这一句没有用

上位者的怜悯 | 园豆:172 (初学一级) | 2015-07-16 11:03

@上位者的怜悯:谢谢

支持(0) 反对(0) Me_Code | 园豆:52 (初学一级) | 2015-07-16 11:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册