★★★★★JS脚本性能优化: 网页Treeview优化探讨(meizz)

meizz 2004-10-28 03:48:19

前段时间我的项目里要用到树,节点从几百到几千都有可能.我就开始收集web treeview
相关的资料,ASP.net自带的treeview,MSDN异步加载树,XLoadTree树,阿信的树,蓝色街
灯的树,美洲豹的树等等不下十几个版本,节点数以百为单位的时候还行,各个版的treeview
表现都还不错,节点数以千为单位时(除异步加载模式外)基本上全挂了,ASP.net自带的那个
玩意在2000节点时打开页面竟然要等 1 分多钟,若再加到5000节点,所有的一次加载模式的树
我没有等到它打开过.若再加到万级节点,那简直就是不可想象的事情了.

从这些测试结果来看,似乎一到千节点就必须用异步加载了.异步加载优点那是勿庸置疑的
理论上可以加载无穷大节点数,且每个子节点都相对独立,不过也有它的缺点:1.它是以服务器
负荷和网络传输为代价换取树的加载速度.异步加载,服务器端都有树的数据源(数据库或XML文
件等),客户端每展开一个新节点,就要从数据源里取一次数据,查库的话服务器负荷加大,加
载XML文件的话,几百上千个子节点XML文件的维护就够你头疼的了,当然这里还有网络传输量的
增加,万一网络不稳定,子节点就加载不了了.2.代码开发的模式分布要比一次性加载复杂.要
考虑B/S之间的应答等.

而我项目里不太适合用异步加载,且我也想攻一下这个关,所以我采用一次数据加载.一次
数据加载的做法大体有两种:

1.直接在服务器端生成HTML,输出到客户端.这种做法是最差的一种,网络传输量大,浏
览器端加载的时间长.没有客户端的扩展性,也没有优化的可能性.这种做法只适合于百数节点
以内的小树,不符合我的需求.

2.服务器端给定一个数据源,在客户端用JS对数据分析,用DOM方式动态生成树节点.
这种方式服务器端负荷小(没有解析过程),网络传递量小,客户端的可扩展性比较好,因此现在
主流的树的写法都是采取这种方式.有人做过相关调察,每个人在打开网页的时候最大等待的时
间小于10秒,即超过10秒没动静,访问者就会失去耐心.而我所搜集到的树没有一个能够达到
这个标准(我用2000节点测试),那么对于多节点树是不是就此宣判了一次加载做法的死刑了
呢?我想知道这个答案.


一次性加载数据源,客户端用脚本动态分析生成树的做法,数据源有两种:

1.用一个大数组存放所有节点信息.比较流行的做法是用JS脚本封装一个treeview类,
然后循环add().

2.加载一个XML文件作为树的数据源.这是一种非常不错的做法,因为xml文件本身的优
势(层级,排序)且XML DOM功能也比较强大.在数据源方面XML文件比大数组更具有优势.

但是就算使用了XML,可是从节点数据到页面上的HTML展示,几千个节点的分析转化时间
也远大于10秒,所以必须要采用别的解决办法!

我想到的办法是结合一次加载与异步加载的优点:异步显示.

treeview 树节点并不是说一加载就全部展开,展开的只是很少的一部分,那么树加载的
时候没有展开的节点就没有必要马上生成,举个例子:一个30*30*30的树,接近28000个节点
总数的树,若是没有特殊必要的话,加载的时候只需要生成第一级的30个节点就够了,想想看
原来要生成28000节点而现在只需要生成30个节点,这个速度快了多少倍呢?至于下面的
节点,在用户点击展开的时候再生成,这样做法每次生成的节点只有几十到几百个而已.一次加
载做法最大的瓶颈豁然开朗.

---- 待续 ----
...全文
4987 243 打赏 收藏 转发到动态 举报
写回复
用AI写文章
243 条回复
切换为时间正序
请发表友善的回复…
发表回复
liugod 2005-08-24
  • 打赏
  • 举报
回复
早就看见这贴了,再次来看看
yzy31 2005-08-19
  • 打赏
  • 举报
回复
mark
sand_storm 2005-06-05
  • 打赏
  • 举报
回复
最后一个直接死机
naci007 2005-04-19
  • 打赏
  • 举报
回复
孔南 2005-04-10
  • 打赏
  • 举报
回复
梅花雪网页控件集 MzTreeView 1.0 测试页
100000 个节点的树!
加载本网页一共花出 56962 毫秒!
根节点 共有 8 个子节点!加载耗时 161 毫秒!
flashasp 2005-03-11
  • 打赏
  • 举报
回复
继续学习。。。。。。
Aden 2005-02-23
  • 打赏
  • 举报
回复
学习...
missRainbowAgain 2005-02-18
  • 打赏
  • 举报
回复
学习...
alern_zyb 2005-02-18
  • 打赏
  • 举报
回复
╭╧╮╭╧╮╭╧╮╭╧╮
║新│║年│║快│║樂│
╘∞╛╘∞╛╘∞╛╘∞╛
Jinpanxu 2005-02-18
  • 打赏
  • 举报
回复
是了,順便給各位大俠拜個年

╭╧╮╭╧╮╭╧╮╭╧╮
║新│║年│║快│║樂│
╘∞╛╘∞╛╘∞╛╘∞╛


Jinpanxu 2005-02-18
  • 打赏
  • 举报
回复
Mark
xinyu1225 2005-02-09
  • 打赏
  • 举报
回复
╭╧╮╭╧╮╭╧╮╭╧╮
║新│║年│║快│║樂│
╘∞╛╘∞╛╘∞╛╘∞╛
athossmth 2005-02-09
  • 打赏
  • 举报
回复
嗬嗬,这个帖子还在啊。

先向梅花雨兄问好拜年,有了你的日历控件后我就不用别的了。

马上要睡觉,没有细看全部文章。就前面几篇来说,请允许我说梅兄有一个思维的障碍。那就是,异步加载,并不等于与用户的输入同步。也就是说,异步加载的异步,其实是分步的意思,这个步数当然与用户的操作不必同步。同步的做法,使用用户的点击触发时间,读取数据,抛开用户,怎么触发呢,settimeout啦。

向梅兄推荐两个网站。一个是google suggest,他就是异步加载数据,使用timeout的。另一个是my.msn.com,它显示的信箱中有多少邮件,也是timeout后触发的。

梦周公去了,有空再聊。。

顺便问一下我的两个问题,嗬嗬,各位高手有空请指点一下我

http://community.csdn.net/Expert/topic/3779/3779972.xml
请问:M$的TreeView Webcontrol的htc里为何用div而不是Table来实现树?

http://community.csdn.net/Expert/topic/3779/3779965.xml
请问如何用Javascript得知用户windows账号
fason 2005-02-03
  • 打赏
  • 举报
回复
to 无心:
我想,在异步加载中,效率的问题已经得到比较好的解决了.

我现在对自己写的treeview的完善已经不是在效率上,主要还是在设计上
keelsike 2005-02-03
  • 打赏
  • 举报
回复
mark
cuixiping 2005-02-02
  • 打赏
  • 举报
回复
梅花雪,我一直没用MSN的啊,qq: 3092869
(直接复制粘贴号码查不到的,里面有全角字符)
cuixiping 2005-02-02
  • 打赏
  • 举报
回复
net_lover(孟子E章) ★★★★★

xxrl(孔曰成仁,孟曰取E)★★

这两个是不是同一个人啊?俺头晕
cuixiping 2005-02-02
  • 打赏
  • 举报
回复
改为文字后,我感觉速度是快了不少。
cuixiping 2005-02-01
  • 打赏
  • 举报
回复
都回家去了?没人继续探讨了。

为什么有的人放假那么早? 我要上班到6号,呜呜~~~
ljianq 2005-01-31
  • 打赏
  • 举报
回复
收藏
加载更多回复(223)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧