在javascript中创建太多对象会影响性能吗?

时间:2014-11-26 07:46:09

标签: arrays performance object javascript

我正在开发一个Web应用程序并在JavaScript中创建许多对象,我需要在整个会话期间或网站打开时维护这些对象,并且我将所有对象引用到单个全局对象。它会影响webb app的性能吗?

var Obj1 = somethig;
var obj200 = something;
window.global.Obj1 = Obj1;
window.global.Obj200 = Obj200;

1 个答案:

答案 0 :(得分:9)

免责声明:我是Internet Explorer 9及更高版本中Chakra Javascript引擎的软件工程师(来自18号楼的Hello!)

简而言之:“它取决于” - 我们需要知道你正在创建多少个对象,它们有多复杂(因为JavaScript没有类,但是原型和实例),创建它们的频率,以及如果你的脚本/程序会导致GC收集对象(并且GC运行不是很好)。

一些提示:

  1. 如果要存储大量简单数据对象,请使用数组来利用运行时所具有的任何优化。如果您使用的是数组,请确保所有元素都具有相同的基础类型(例如,不要将JavaScript对象与同一数组中的数字混合在一起)。
  2. JavaScript被垃圾收集 - 这意味着它具有与之相关的所有缺点,包括在GC运行时暂停整个脚本执行。如果有很多对象可以一次性收集,那么GC暂停将运行一段时间。注意内存碎片化。
  3. 避免实例属性(即使用原型属性或构造函数属性),即:
  4. 为:

    for(var i = 0; i < 1000; i++ ) {
        var foo = { baz: function() { return 5; } };
        foo.bar();
    }
    

    好:

    function Foo() { } // `Foo` constructor.
    
    Foo.prototype.baz = function() { return 5; };
    
    for(var i=0; i < 1000; i++ ) {
        var foo = new Foo();
        foo.bar();
    }
    

    也很好:

     function Foo() { } 
    
     Foo.baz = function(foo) { return 5; };
    
     for(var i=0; i < 1000; i++ ) {
        var foo = new Foo();
        Foo.bar( foo );
     }
    

    至于您的代码示例,如果您位于根范围(称为global,在浏览器中由window对象设置别名),则var关键字具有效果制作财产。所以这个:

    var Obj1 = somethig;
    var obj200 = something;
    window.Obj1 = Obj1; // there is no `window.global` object
    window.Obj200 = Obj200;
    

    ...实际上并没有做任何事情:var Obj1 window.Obj1相同。

    最后,一个protip:只给出Constructor函数TitleCase名称,否则其他所有(vars,parameters,locals等)lowerCase名称。调用实例Obj1让我的脸抽搐。

    与往常一样,黄金法则适用:过早优化是万恶之源 - 在对您的代码进行重大更改之前,先查看代码 以查看是否存在问题代码(和IE 11的F12工具非常适合检查代码的内存和处理性能,顺便说一下 - 不是我没有偏见!)。