我正在编写一个JS库,它可以阅读国际象棋游戏,将它们变成可重玩的游戏,在一个网页上可以有很多游戏(一个在自己的div中),我想知道的是 - 考虑性能 - 如果是更好的是拥有一个大对象来保存所有游戏的所有动作或许多较小的对象,每个对象存储一个游戏的动作.
我意识到这可能是整个优化过程中的一个小点,但它是我现在要解决的问题.
Sam*_*ens 28
唐纳德克努特:"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源"
首先,从域建模的角度设计适合您的游戏的数据模型是正确和自然的.
构建软件.
然后,当您处于开发阶段时,分析性能是有意义的,找出一些您希望游戏工作的低性能环境,并在其中进行测试.
你可能会发现你没有任何问题,正如其他人在这个问题的答案中所述.
如果您发现问题,请分析您的代码并发现原因.优化您需要的代码.即使您发现了性能问题,只要您设计得很好,它就不太可能由您的数据模型引起.
如果数据模型确实是一个性能问题,那么只有在您需要的时候才能将您的初始设计妥协,以获得所需的性能,记录您所做的妥协以及为什么必须这样做.
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密集的事情!
所以,我的答案是......不要听人们对效率的评价,或者最好的评价(甚至是我!).在您的图书馆设计中,做最有意义的事情.现在,你正试图把一个方形钉子塞进一个圆孔里.你需要先确定你的需求是什么,一切都会自然而然地发生.它甚至可能让你大吃一惊!