代码性能故障排查-我们可以做得更多

今天在项目上遇到一个问题,代码执行的效率太低,最终分析得知,是出在这段代码上

先看一下这段代码

for (int i = 0; i < powerList.Count; i++)

                {

                    Guid powerId = powerList[i].VGUID;//权限ID

                    DataRow dr = dt.NewRow();

                    dr[0] = powerList[i].FuncName;

                    dr[1] = powerList[i].IsParent;

                    dr[2] = powerList[i].VGUID;

                    for (int j = 3; j < dt.Columns.Count; j++)

                    {

                        Guid roleId = roleList[j - 3].VGUID;

                        if (_db.CS_Power_Role.Where(c => c.PowerID == powerId && c.RoleID == roleId).Count() != 0)

                        {

                            dr[j] = false;

                        }

                        else

                        {

                            dr[j] = true;

                        }

                    }

                    dt.Rows.Add(dr);

                }

结果:执行时间3.28s,大概执行了三百多条SQL语句

优化处理之后:

List<CS_Power_Role> powerRoleList = _db.CS_Power_Role.ToList();

                for (int i = 0; i < powerList.Count; i++)

                {

                    Guid powerId = powerList[i].VGUID;//权限ID

                    DataRow dr = dt.NewRow();

                    dr[0] = powerList[i].FuncName;

                    dr[1] = powerList[i].IsParent;

                    dr[2] = powerList[i].VGUID;

                    for (int j = 3; j < dt.Columns.Count; j++)

                    {

                        Guid roleId = roleList[j - 3].VGUID;

                        dr[j] = !powerRoleList.Any(c => c.PowerID == powerId && c.RoleID == roleId);

                    }

                    dt.Rows.Add(dr);

                }

执行时间00:00:00.0090005s,只需要执行一次SQL

原来是在方法里面执行了太多SQL导致运算结果变慢了,其实问题很简单,如果对一个不经常发生变化的数据源进行操作,可以先把它从数据库读入内存,遍历内存可比执行SQL快多了



转载于:https://my.oschina.net/webxiaohua/blog/292438

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值