日期:2014-05-16  浏览次数:20400 次

高手请进,js执行速度随页面元素的增加越来越慢是什么原因?有什么解决方法呢?
最近在测试一段代码的时候发现的这个问题
很郁闷

以下是对1000个节点进行操作的几次重复测试
结果如下:
共有节点:10000
子节点数据:1000
清除旧数据:31毫秒

EV:BabyMap:0

EP:nodeIndex(0)
EP:haveBaby(1000)
EP:mainLoop:2031
EP:isHavebaby:80
EP:insertHtml:1344

EP:nodeIndex(9)
EP:haveBaby(1000)
EP:mainLoop:2968
EP:isHavebaby:31
EP:insertHtml:1796

EP:nodeIndex(8)
EP:haveBaby(1000)
EP:mainLoop:3578
EP:isHavebaby:15
EP:insertHtml:1813

EP:nodeIndex(7)
EP:haveBaby(1000)
EP:mainLoop:4578
EP:isHavebaby:64
EP:insertHtml:1984

EP:nodeIndex(6)
EP:haveBaby(1000)
EP:mainLoop:5485
EP:isHavebaby:16
EP:insertHtml:1968

EP:nodeIndex(5)
EP:haveBaby(1000)
EP:mainLoop:6453
EP:isHavebaby:64
EP:insertHtml:2047

EP:nodeIndex(4)
EP:haveBaby(1000)
EP:mainLoop:7547
EP:isHavebaby:95
EP:insertHtml:2250

解释一下:
EP:mainLoop:7547-----主循环的执行时间
EP:isHavebaby:95-----主循环中一段代码的执行事件(这里可以忽略)
EP:insertHtml:2250---插入HTML代码的执行时间

因为每次都是对1000个节点进行操作
计算量和需要插入的html代码长度都是基本一致的
但是结果却显示
执行事件从最初的2031+1344=3K,上升到后来的7547+2250=9K
效率下降之快......呜呜,比我花了好长时间调整来的性能优化效果可明显的多了

js的执行速度为什么与页面元素数量关系这么大呢?
我的机器1G内存,还够浏览器吃的
想不通,请高手指点

解决问题后立刻放分

还想到了以前的一个现象
最初有个html和js混合的页面
其中有一段js的循环,空循环,竟然执行的奇慢
把所有的html代码删除后
再运行那个空循环
消耗时间:0

太奇怪了

这个问题困扰了好几天了
一直找不到原因和解决方法



------解决方案--------------------
你增加的网页的元素都在内存里面的啊,增加的越多,处理时间和显示的速度都会延长,所以会慢啊
------解决方案--------------------
加快DHTML 的一组技巧

http://www.knowsky.com/3744.html
------解决方案--------------------
这个原因是很多的, 要具体看你的应用和你的代码而定优化方案, 一千个节点量不算大.
------解决方案--------------------
看来都是高手们讨论的性能问题,只有学习的份了。

呵呵,帮顶。
------解决方案--------------------
DOM 的内部实现涉及很多字符串操作 字符串操作是比较耗时的
另外浏览器的实现方法也有一定原因 你用 Firefox 测试的话 肯定比 IE 效率高
不是必要的话 就不要在客户端做太复杂的 DOM 操作
Ajax 的出现也加重了客户端的此类负担 实际应用中若平衡得不好的话 必将弊大于利

------解决方案--------------------
能不能让把循环放在server端呢,这样js就不用去耗费那么多时间了
------解决方案--------------------
如果不复杂就用.Net的回调实现局部刷新!

我比较迷惑在什么样的需求情况下需要一次加栽这么多内容呢??


-----------------------
没有最好,只有更好!
http://www.crossgo.com
------解决方案--------------------
JF
------解决方案--------------------
好像是代码问题 我这样测试就好像没问题

<script language= "javascript ">
function window.onload()
{
var nodes = new Array();
for(var i=0;i <10;i++)
{
var area = document.body;//FF测试时做相应的更改
var aa = document.createElement( "div ");
area.appendChild(aa);
nodes[i] = aa;
nodes[i].subNodes = new Array();
for(var j=0;j <1000;j++)
{
var aa = document.createElement( "div ");
nodes[i].appendChild(aa);
nodes[i].subNodes.push(aa);
}
}
var stime = new Date();

for(var i=0,l=nodes.length;i <l;i++)
{
var havebadycount = 0;
var ihavebadycount = 0;
var insertcount = 0;