在JavaScript或许多较小的对象中使用一个大对象会更好吗?

Pur*_*fan 14 javascript

我正在编写一个JS库,它可以阅读国际象棋游戏,将它们变成可重玩的游戏,在一个网页上可以有很多游戏(一个在自己的div中),我想知道的是 - 考虑性能 - 如果是更好的是拥有一个大对象来保存所有游戏的所有动作或许多较小的对象,每个对象存储一个游戏的动作.

我意识到这可能是整个优化过程中的一个小点,但它是我现在要解决的问题.

Sam*_*ens 28

唐纳德克努特:"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源"

首先,从域建模的角度设计适合您的游戏的数据模型是正确和自然的.

构建软件.

然后,当您处于开发阶段时,分析性能是有意义的,找出一些您希望游戏工作的低性能环境,并在其中进行测试.

你可能会发现你没有任何问题,正如其他人在这个问题的答案中所述.

如果您发现问题,请分析您的代码并发现原因.优化您需要的代码.即使您发现了性能问题,只要您设计得很好,它就不太可能由您的数据模型引起.

如果数据模型确实是一个性能问题,那么只有在您需要的时候才能将您的初始设计妥协,以获得所需的性能,记录您所做的妥协以及为什么必须这样做.

  • 我恭敬地不同意.虽然这是一个更晚的趋势,但早期优化将解决许多智能手机技术问题.并且有许多仅限JS的应用程序项目(想到雅虎)需要进行极端优化.类似问题的问题不是过度优化,它是优化的,并且语言效率低,而且内存泄漏很糟糕,因为浏览器使用Javascript,这是一个有效的问题. (3认同)
  • @ vol7ron:嗯,确实你不能没有正念表现.当然,有些项目的性能非常重要,您必须不断考虑它.然而,这不是其中之一.问题在于,很多时候我们对表现不佳的假设只是假设.历史上充满了优化错误事物的人,因为他们没有可靠的数据来做出决策.但是,**架构**应该尽早考虑性能.从无知,我猜这是智能手机问题的原因. (2认同)

Tim*_*Tim 10

利用对象的最佳方法是在JavaScript中使用原型模式.这意味着你与对象共享数据,而不是吝啬地说"那是我的!".

这种模式在JavaScript库中无处不在.它看起来像这样:

var Template = {
  extend: function () {
    var F = function () {};
    F.prototype = this.prototype;
    var instance = new F();
    instance.mixin.apply(instance, arguments);

    return instance;
  },

  mixin: function (mixins) {
    for (var i = 0, len = arguments.length; i < len; i++) {
      for (var k in arguments[i]) if (arguments[i].hasOwnProperty(k)) {
        this[k] = arguments[i][k];
      }
    }

    return this;
  }
};
Run Code Online (Sandbox Code Playgroud)

这个神奇的类将跨继承链共享数据,并使您的对象模型更简单.什么都不是一个类 - 一切都是对象!这意味着理解JavaScript的细节,以免陷入粘性粘性,但是非常值得.

这意味着当你有:

var Koopa = Template.extend({
  hasShell: true,
  fatalFlaw: 'shell'
});

var Bowser = Koopa.extend({
  fatalFlaw: 'tail'
});
Run Code Online (Sandbox Code Playgroud)

存储的数据如下:

+-------------------.   +---------------------.   +---------.
| Bowser             |->| Koopa                |->| Template |
+--------------------+  +----------------------+  +----------+
|fatalFlaw => 'tail' |  | hasShell => true     |  | mixin    |
 `-------------------+  | fatalFlaw => 'shell' |  | extend   |
                         `---------------------+   `---------+
Run Code Online (Sandbox Code Playgroud)

这种设计源于克罗克福德神父的原型继承设计.就像Knuth所说:"过早的优化是万恶之源!"

并且...如果这看起来像一个非主题的答案 - 它的意图.您应该询问您的设计如何满足您的需求.如果你做得好,那么一切都应该落实到位.如果你认为不够,你最终会得到一些令人讨厌的副作用和臭的代码.帮自己一个忙,想出一个设计,消除你的任何犹豫.浏览器现在比解决国际象棋更复杂和CPU密集的事情!

所以,我的答案是......不要听人们对效率的评价,或者最好的评价(甚至是我!).在您的图书馆设计中,做最有意义的事情.现在,你正试图把一个方形钉子塞进一个圆孔里.你需要先确定你的需求是什么,一切都会自然而然地发生.它甚至可能让你大吃一惊!


ide*_*ide 5

在我看来,小物体是更好的选择。

  • 从软件工程的角度来看,采用更小的可组合对象的模块化设计比单一对象要好得多。我什至会将每个动作表示为一个对象,而不是每个游戏都有一个对象。
  • 最近的 JS 引擎(例如 V8)尝试从“类”定义构建类似结构的对象。这是在幕后发生的,以便快速访问属性。Google 在V8 的设计中解释了这一点。本质上,如果您有同一类的多个小实例,这些实例或多或少是静态的(即该类的每个实例都具有相同的属性),V8 可以针对这种情况进行优化。