同事写了段JQuey的代码,在某些机器上,会出现IE假死的性能问题。
我测试了一下代码花费的时间,在我的机器上,会花费600多毫秒,但在某些机器上会花费6秒多(10倍的增长),这样就导致了IE的假死。而且发现与IE版本无关,在大多数机器上会都只需要600多毫秒,不过CPU会有10%以上的瞬间提长。
先来看看出问题的代码:



其实这段代码很简洁,只是将用AJAX取过来的数据替换一部分当前页面的数据,但性能确实不够好。
开始找原因,看看到底是什么慢?

将此行代码分拆,逐元素去分析各自花费的时间:
$(".eXtremeTable") 花费20毫秒左右;
$(html).find(".eXtremeTable") 花费200毫秒左右;
replaceWith() 花费10毫秒左右;
不难定位到是由于$(html).find(".eXtremeTable")这种方式引起的。
(这都是在我机器上的测试结果,而且每次可能不完全一样)
简单的可以这样优化:




但仔细想想,这样仍然会造成在某些机器上2秒以上的时间消耗,照样是不可接受的。
遂采用比较原始的办法,修改源程序如下:















var sel='<div id=\"scriptDiv\" style=\"display:none;\">'
pos=html.indexOf(sel)
content=html.substr(pos+sel.length);
pos2=content.indexOf('</div>');
var content=content.substr(0,pos2+'</div>'.length);
document.getElementById("scriptDiv").innerHTML=content;
// $("#scriptDiv").replaceWith($(html).find("#scriptDiv"));
现在此段代码花费的时间几乎为0毫秒。
OK,IE再也不假死了。
问题分析:
原因应该就出在jQuery(html)这个方法上,官方文档解释如下:






因为要构建一个完整的DOM,所以需要花费较长的时间。
至于为何在某些机器上出现高达6秒多的时间消耗,百思不得其解,请高手指点!