这个问题很早就知道,即在对象数量达到一定程度的时候(例如50000),创建新对象的速度明显下降。过去在和aimingoo共事的时候(2006年的某个时候),我花时间研究了一下。
当时我首先猜测是否是在一个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!
分享到:
- 2007-07-23 11:47
- 浏览 7917
- 评论(1)
- 论坛回复 / 浏览 (1 / 3595)
- 查看更多
相关推荐
浅谈JScript中使用构造函数创建树对象 在本文中,我们将讨论如何使用JScript中的构造函数来创建树对象。我们首先介绍了构造函数的概念,然后探讨了如何使用构造函数来创建用户自定义的树对象。 1. 构造函数的概念 ...
- 在IE6中,JScript引擎在处理大量变量分配时会触发垃圾收集,导致脚本暂停,这可能导致性能下降。而在IE7和IE8中,虽然也存在垃圾收集机制,但可能有所优化,减少了对用户界面的影响。 2. **CSS宽度和高度的定义*...
标题"ado 帮助和Script5.6"指的是这个压缩包包含的资源主要关于ADO(ActiveX Data Objects)以及Script5.6版本的相关文档。ADO是微软开发的一个组件,用于在各种语言环境中访问数据库,而Script5.6则可能是指Windows...
"Microsoft JScript 运行时错误: 缺少对象" 是一个常见的JavaScript错误,它通常在尝试访问或操作一个未定义或不存在的对象时出现。在ASP.NET和C#的环境中,这个问题可能涉及到客户端脚本(JavaScript)与服务器端...
JScript通过XMLHttpRequest对象实现AJAX通信,包括创建请求、发送请求、接收响应等步骤。 七、Promise和异步编程 随着ES6的引入,JScript引入了Promise对象来处理异步操作,解决了回调地狱问题。async/await语法让...
9. **CSS Expression**:IE6-IE7支持CSS表达式,但其性能问题和非标准性使得在现代开发中应避免使用。可使用静态值或JavaScript进行替代。 10. **布局和定位问题**:IE6的双倍边距问题、怪异盒模型等都需要特殊的...
然而,随着时间的推移,IE6的安全性和性能逐渐暴露出诸多问题,而IE8作为其后续版本,虽然在很多方面有所改进,但在某些场景下,用户或开发者可能需要让IE8的行为更接近IE6,以确保老旧应用的正常运行。这就涉及到了...
开发者应确保代码在IE6的JScript引擎下仍能正常执行,或者使用像jQuery这样的库来处理兼容性问题。 3. DOM操作:IE6的DOM模型与现代浏览器有所不同,可能会影响动态内容的创建和修改。开发者需要了解这些差异,并...
【标签】"ieTestie6ie7ie8ie9ie5.5"是关键词的组合,它强调了IETester与Internet Explorer各版本测试的关联性。在搜索引擎优化(SEO)中,这样的标签可以帮助用户更容易找到与IE浏览器测试相关的资源。 【压缩包子...
1. **IE6兼容性问题**:IE6是2001年发布的,其JavaScript引擎(JScript)相比现代浏览器有许多局限。例如,它不支持`Array.prototype.forEach`、`Array.prototype.map`等数组方法,不支持`getElementsByClassName`,...
这个文件提供了关于JScript的全面指南,对于学习和解决JScript编程问题非常有帮助。 **JScript学习资源** 1. **在线文档** - Microsoft官方可能提供JScript的在线文档,介绍语言特性和API。 2. **博客文章** - ...
3. **版本差异**:JScript有自己的版本发展,如JScript 5.6对应IE6,JScript .NET则是在.NET Framework中的一种实现。 4. **类型系统**:JScript也有弱类型系统,但它对类型转换的处理可能与JavaScript有所不同。 ...
JScript支持基于原型的面向对象编程,可以创建对象、定义构造函数和原型,实现继承和封装。 10. **正则表达式** JScript提供了强大的正则表达式引擎,用于文本匹配和替换,提供了多种模式修饰符如g(全局搜索)、...
IE6+的DOM/BOM对象列表,编写web程序时,浏览器端必备参考资料,由本人原创。
2. **对象和原型**:JScript中的对象是属性和方法的集合,可以通过字面量或构造函数创建。原型是实现继承的一种方式,每个对象都有一个原型链,可以访问到其原型上的属性和方法。 3. **事件处理**:在Web开发中,...
标题“IE6中greybox弹出问题”提示我们,这个问题是关于greybox插件在IE6上无法正常工作的。Greybox是一种JavaScript库,它允许在当前页面上以模态对话框的形式打开新的窗口或内容,而不会让用户离开当前页面。在...
**JScript 语言参考.chm** 是一个关于JScript编程语言的离线帮助文档,通常以CHM(Compiled Help Manual)格式提供,这种格式是微软开发的一种用于存储HTML帮助文档的压缩格式。JScript是微软对ECMAScript...
JScript 基础 什么是 Jscript?...创建自己的对象 JScript 保留字 -------------------------------------------------------------------------------- © 2000 Microsoft Corporation 版权所有。保
由于文件名为"Script56_chs",我们可以推测手册可能包含了JScript的一个特定版本或主题的深入讨论,如JScript 5.6的中文版。对于那些在Windows环境中尤其是使用旧版IE浏览器的开发者来说,这份手册尤其有价值。
6. **ActiveXObject**:这是JScript 与JavaScript的一个主要区别,它可以创建和操控COM对象,从而访问Windows系统服务或与其他非Web应用程序交互。 7. **错误处理**:JScript 提供了try...catch语句来捕获和处理...