【问题标题】:Does creating too many objects in javascript will affect the performance?在javascript中创建太多对象会影响性能吗?
【发布时间】:2015-01-24 11:03:00
【问题描述】:

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

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

【问题讨论】:

  • “太多”意味着超出需要,这本身就是一个问题
  • 请注意,您显示的代码 sn-p 不会创建任何对象。它只是分配变量和属性来指向已经存在的。
  • 我想something 是一个对象字面量。

标签: arrays performance object javascript


【解决方案1】:

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

简而言之:“视情况而定”——我们需要知道你创建了多少对象,它们有多复杂(因为 JavaScript 没有类,但有原型和实例),你创建它们的频率,以及如果您的脚本/程序会导致 GC 收集对象(并且 GC 运行不漂亮)。

一些提示:

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

不好:

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一样的东西。

最后,一个小提示:只给构造函数TitleCase 名称,否则所有其他(变量、参数、本地变量等)lowerCase 名称。调用实例Obj1 让我的脸抽搐。

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

【讨论】:

  • 还有一点值得澄清的是,即使你不使用var关键字,变量也会自动成为window的属性,这实际上要糟糕得多,尤其是在里面职能。此外,不能删除使用 var 关键字声明的变量:var x=7; delete x; 将失败,而 y=3; delete y; 将成功删除该变量并因此对其进行 GC。
  • @istos 使用delete 运算符只会从其父对象中删除一个属性;它不一定会触发 GC,也不一定会为 GC 提供内存,也不必让 GC 首先收集对象。不必要地deleteing 属性只是在浪费周期。
  • 那么如果我在内存中有一些对象,它是 window 的一个属性,并且删除成功了,那个对象会发生什么?
  • @istos 如果任何其他对象持有对已删除属性持有的值的引用,那么它将保留在内存中。如果 GC 确定对象没有强引用(与弱引用相比,例如 WeakMap),那么它将被收集并释放内存。 GC 传递是非确定性的,不会由delete 操作触发。
  • 谢谢戴,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多