首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

跪求高手!帮忙优化一上【递归代码】速度太慢了!多谢了

2012-09-17 
跪求高手!帮忙优化一下【递归代码】速度太慢了!谢谢了图片下面是源码~~~帮忙优化一下【递归代码】吧。。循环10此

跪求高手!帮忙优化一下【递归代码】速度太慢了!谢谢了
图片下面是源码~~~帮忙优化一下【递归代码】吧。。循环10此就要用0.4秒太慢了。。而且还不到50条数据。万一是2W条数据那岂不要卡死了~~~求帮忙~~~谢谢了


C# code
 protected void Page_Load(object sender, EventArgs e)    {        DataTable dt = "select id,name,Fid,LV from APP_Func".FSelect().FWhere("id<50 and LV<=4");        DateTime ww = DateTime.Now;        for (int i = 0; i < 10; i++)        {            RecursiveClass(dt, 0, "fid", dt.Clone()).FRepeater(this.Repeater1);        }        Label1.Text = "循环【10】次的时间 " + ww.FTDiff(DateTime.Now).ToString() + " 秒,总共" + dt.Rows.Count + "条数据";    }    /// <summary>    /// [递归]无限级分类    /// </summary>    /// <param name="ddtt">有数据的datatable</param>    /// <param name="id">起初的ID</param>    /// <param name="Fid">id=父类字段名</param>    /// <param name="dt">返回的DT数据</param>    /// <returns></returns>    public DataTable RecursiveClass(DataTable data, int id, string Fid, DataTable dt)    {        for (int i = 0; i < data.Rows.Count; i++)        {            if (!(Select(dt, "id=" + id.ToString(), "").Rows.Count > 0) && id != 0)            {                dt = Select(data, "id=" + id.ToString(), "");            }            if (int.Parse(data.Rows[i][Fid].ToString().Trim()) == id)            {                DataRow dr = dt.NewRow();                string[] sd = new string[dt.Columns.Count];                for (int j = 0; j < dt.Columns.Count; j++)                {                    sd[j] = data.Rows[i][dt.Columns[j].ToString()].ToString();                }                dr.ItemArray = sd;                dt.Rows.Add(dr);                RecursiveClass(data, int.Parse(data.Rows[i]["id"].ToString()), Fid, dt);            }        }        return dt;    }    /// <summary>    /// 执行DataTable中的查询返回新的DataTable    /// </summary>    /// <param name="dt">源数据DataTable</param>    /// <param name="Where">查询条件【不需要加where】</param>    /// <param name="Order">排序【不需要加Order by】</param>    /// <returns>返回查询OK的DataTable</returns>    public DataTable Select(DataTable dt, string Where, string Order)    {        DataTable newdt = new DataTable();        newdt = dt.Clone();        DataRow[] dr = dt.Select(Where, Order);        for (int i = 0; i < dr.Length; i++)        {            newdt.ImportRow((DataRow)dr[i]);        }        return newdt;    }



[解决办法]
可以尝试使用点击节点获取子节点的方法.
[解决办法]
递归本身就慢……
两个思路 要么就缓存在内存里面 尽量少去查询
要么就更改数据格式(比如改双键环形树)
[解决办法]

无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
[解决办法]
这也叫太慢啊,你不但递归数据,还递归绑定控件呢。

而且你还是用了低性能的查询方式,DataSet 速度不快,你还大量的拼接字符串。数据类型转换,能快吗?

而且绑定控件根本没必要每次都新建一个datatable,你都知道select 了还有必要新建一个?
[解决办法]
探讨
无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推

[解决办法]
ajax+json 获取福级别 然后再福级别下获取该级别数据 , 返回的json有个可以json数据分页插件
[解决办法]
表示楼主钻牛角尖了...
------解决方案--------------------



这个结构还分页?
我真服了,你先把你想要什么搞清楚。

你是要一次性加载出来,你给谁看呢你?你知道一台计算机的屏幕有多大吗?你知道你这个家在出来了有几米吗?
是不是我百度的时候搜索出来了两百万个结果,然后他直接全部给我显示出来?他能吗?他能的话我看得了吗?

[解决办法]
DataRow dr = dt.NewRow();
string[] sd = new string[dt.Columns.Count];
这些变量定义能放外面就放外面去

觉得楼主动向不明,递归就这样,根据条件减少下循环次数,也没什么好优化的,换个方向思考吧
[解决办法]
0.4秒?慢?你认为你把鼠标从屏幕左上角移动到正中间的点上需要多长时间?

热点排行