`
hax
  • 浏览: 962649 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于JScript 5.6及其之前(IE6)引擎的创建对象的性能问题

    博客分类:
  • JS
阅读更多
这个问题很早就知道,即在对象数量达到一定程度的时候(例如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!
分享到:
评论
1 楼 hax 2007-07-23  
本文的动机是总结一下以前的经验,也是对http://www.iteye.com/topic/101506中的一个性能测试的小问题的更清楚的解释。

相关推荐

    浅谈Jscript中使用构造函数创建树对象.pdf

    浅谈JScript中使用构造函数创建树对象 在本文中,我们将讨论如何使用JScript中的构造函数来创建树对象。我们首先介绍了构造函数的概念,然后探讨了如何使用构造函数来创建用户自定义的树对象。 1. 构造函数的概念 ...

    IE6、IE7、IE8对css和js支持方面差异的研究

    - 在IE6中,JScript引擎在处理大量变量分配时会触发垃圾收集,导致脚本暂停,这可能导致性能下降。而在IE7和IE8中,虽然也存在垃圾收集机制,但可能有所优化,减少了对用户界面的影响。 2. **CSS宽度和高度的定义*...

    ado 帮助和Script5.6

    标题"ado 帮助和Script5.6"指的是这个压缩包包含的资源主要关于ADO(ActiveX Data Objects)以及Script5.6版本的相关文档。ADO是微软开发的一个组件,用于在各种语言环境中访问数据库,而Script5.6则可能是指Windows...

    Microsoft JScript 运行时错误: 缺少对象

    "Microsoft JScript 运行时错误: 缺少对象" 是一个常见的JavaScript错误,它通常在尝试访问或操作一个未定义或不存在的对象时出现。在ASP.NET和C#的环境中,这个问题可能涉及到客户端脚本(JavaScript)与服务器端...

    JScript中文参考手册

    JScript通过XMLHttpRequest对象实现AJAX通信,包括创建请求、发送请求、接收响应等步骤。 七、Promise和异步编程 随着ES6的引入,JScript引入了Promise对象来处理异步操作,解决了回调地狱问题。async/await语法让...

    IE6-IE11兼容性问题列表及解决办法.rar

    9. **CSS Expression**:IE6-IE7支持CSS表达式,但其性能问题和非标准性使得在现代开发中应避免使用。可使用静态值或JavaScript进行替代。 10. **布局和定位问题**:IE6的双倍边距问题、怪异盒模型等都需要特殊的...

    IE8优化(模仿IE6)

    然而,随着时间的推移,IE6的安全性和性能逐渐暴露出诸多问题,而IE8作为其后续版本,虽然在很多方面有所改进,但在某些场景下,用户或开发者可能需要让IE8的行为更接近IE6,以确保老旧应用的正常运行。这就涉及到了...

    高度仿真IE6

    开发者应确保代码在IE6的JScript引擎下仍能正常执行,或者使用像jQuery这样的库来处理兼容性问题。 3. DOM操作:IE6的DOM模型与现代浏览器有所不同,可能会影响动态内容的创建和修改。开发者需要了解这些差异,并...

    ieTest ie6 ie7 ie8 ie9 ie5.5

    【标签】"ieTestie6ie7ie8ie9ie5.5"是关键词的组合,它强调了IETester与Internet Explorer各版本测试的关联性。在搜索引擎优化(SEO)中,这样的标签可以帮助用户更容易找到与IE浏览器测试相关的资源。 【压缩包子...

    IE兼容IE6,IE7,IE8,IE9,IE10js文件

    1. **IE6兼容性问题**:IE6是2001年发布的,其JavaScript引擎(JScript)相比现代浏览器有许多局限。例如,它不支持`Array.prototype.forEach`、`Array.prototype.map`等数组方法,不支持`getElementsByClassName`,...

    JScript参考

    这个文件提供了关于JScript的全面指南,对于学习和解决JScript编程问题非常有帮助。 **JScript学习资源** 1. **在线文档** - Microsoft官方可能提供JScript的在线文档,介绍语言特性和API。 2. **博客文章** - ...

    Javascript与Jscript从入门到精通

    3. **版本差异**:JScript有自己的版本发展,如JScript 5.6对应IE6,JScript .NET则是在.NET Framework中的一种实现。 4. **类型系统**:JScript也有弱类型系统,但它对类型转换的处理可能与JavaScript有所不同。 ...

    JScript中文參考手冊

    JScript支持基于原型的面向对象编程,可以创建对象、定义构造函数和原型,实现继承和封装。 10. **正则表达式** JScript提供了强大的正则表达式引擎,用于文本匹配和替换,提供了多种模式修饰符如g(全局搜索)、...

    Jscript OBJ IE调试对象表

    IE6+的DOM/BOM对象列表,编写web程序时,浏览器端必备参考资料,由本人原创。

    JScript.代码

    2. **对象和原型**:JScript中的对象是属性和方法的集合,可以通过字面量或构造函数创建。原型是实现继承的一种方式,每个对象都有一个原型链,可以访问到其原型上的属性和方法。 3. **事件处理**:在Web开发中,...

    IE6中greybox弹出问题

    标题“IE6中greybox弹出问题”提示我们,这个问题是关于greybox插件在IE6上无法正常工作的。Greybox是一种JavaScript库,它允许在当前页面上以模态对话框的形式打开新的窗口或内容,而不会让用户离开当前页面。在...

    JScript 语言参考.chm

    **JScript 语言参考.chm** 是一个关于JScript编程语言的离线帮助文档,通常以CHM(Compiled Help Manual)格式提供,这种格式是微软开发的一种用于存储HTML帮助文档的压缩格式。JScript是微软对ECMAScript...

    jscript语言参考手册chm

    JScript 基础 什么是 Jscript?...创建自己的对象 JScript 保留字 -------------------------------------------------------------------------------- © 2000 Microsoft Corporation 版权所有。保

    Jscript脚本技术手册

    由于文件名为"Script56_chs",我们可以推测手册可能包含了JScript的一个特定版本或主题的深入讨论,如JScript 5.6的中文版。对于那些在Windows环境中尤其是使用旧版IE浏览器的开发者来说,这份手册尤其有价值。

    JScript 语言参考(CHM)

    6. **ActiveXObject**:这是JScript 与JavaScript的一个主要区别,它可以创建和操控COM对象,从而访问Windows系统服务或与其他非Web应用程序交互。 7. **错误处理**:JScript 提供了try...catch语句来捕获和处理...

Global site tag (gtag.js) - Google Analytics