浏览 3596 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-23
当时我首先猜测是否是在一个closure里,因为当前[[scope]]下可访问的变量太多造成的,即我怀疑是jscript的name resolve的问题,但实际写了一些测试用例证明这个猜测是错误的。任何时候,只要存在大量对象,不管在当前创建新对象的function里是否能访问到已经存在对象,性能都十分低下。 不知怎的,我开始怀疑是否是垃圾回收的问题。于是我尝试在创建对象的循环里插入了CollectGarbage的强制调用。按说GC调用会明显的降低性能(不涉及创建对象的代码中也确实如此),但是我测试的结果是,降低的并不多!而且随着我调节参数来确定每创建多少个对象调用一次GC,发现统计性能结果呈一种波浪形(按说应该是呈线性),在256及其倍数的对象个数左右,是性能损失最少的地方。由此,我断定,JScript在256次创建对象后会调用一次GC(我的假设是:GC很可能是另一个线程在运行,因此两次非常靠近的GC调用有一定概率会变为一次),而JScript那原始的计数GC的性能很低。反复的调用GC,这就是JScript性能下降的罪魁祸首。 最近两天看到ajaxan上的综述文章,证明了我的推理:http://ajaxian.com/archives/garbage-collection-in-ie6 实际上该文指出,2003年的时候,IE团队的自己人就说明过这个问题:http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx 特别是在comments中,作者Eric说: The heuristics are we do a GC on the next statement after any one of the following limits are passed since the previous GC: 0x100 variables/temps/etc allocated 0x1000 array slots allocated 0x10000 bytes of strings allocated ...As you can see it's a pretty naive heuristic. 对此,Brendan Eich回应道: Sorry, that heuristic is not naive, it's just plain wrong. Allocation of particular types or slots does not predict garbage, and the magnitudes are wrong compared to the cost of GC'ing a large live object graph. 我非常同意BE同志的看法,这不是幼稚,而是错误。尽管IE7已经修复了这个bug,但是在很长的时间里,我们仍然要考虑IE6,不得不仔细平衡对象数量的开销,为此付出许多额外代价。 MS最后给了一个hotfix:http://support.microsoft.com/kb/919237,然而所谓hotfix,就是仍然不是强制安装的。sigh! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-23
本文的动机是总结一下以前的经验,也是对http://www.iteye.com/topic/101506中的一个性能测试的小问题的更清楚的解释。
|
|
返回顶楼 | |