0

我的主要问题如下:

当您希望人们与之交互的频繁访问功能(返回对象)时,信息隐藏会损害性能(CPU/内存)吗?

或者这是否被认为是微优化,尤其是在使用诸如node.js(long running process)之类的平台时。我是否应该考虑性能而不是信息隐藏?


通过阅读 Douglas Crockford 关于信息隐藏的文章,我知道我可以添加私有成员和特权方法。但是根据 Douglas Crockford 的这句话,原型机制可以帮助您节省内存:

当一个成员被寻找并且在对象本身中没有找到时,它会从对象的构造函数的原型成员中获取。原型机制用于继承。它还可以节省内存。

当只保存内存时,我想这可能没什么大不了的,因为内存正在变得越来越便宜。但是根据John Resig 的这篇文章,在原型链中添加许多属性也更快(CPU)。

因此,如果您有一个希望人们与之交互的频繁访问的函数(返回一个对象),那么将对象属性放在原型链中并实例化它对您有利。

用一堆原型属性实例化一个函数非常非常快。它完全颠覆了模块模式,以及类似的模式。因此,如果您有一个希望人们与之交互的频繁访问的函数(返回一个对象),那么将对象属性放在原型链中并实例化它对您有利。

// Very fast
function User(){}
User.prototype = { /* Lots of properties ... */ };
// Very slow
function User(){
  return { /* Lots of properties */ };
}

这也可能不是一个大问题,因为 CPU 的速度越来越快(摩尔定律)。此外,由于 Javascript 引擎在性能方面取得了令人难以置信的进步,我想知道我是否应该考虑这一点,或者只是使用信息隐藏。


我猜我也有这个子问题:

我如何使用诸如 node.js 之类的平台有效地测量内存和 CPU?

4

1 回答 1

2

在我看来,这听起来确实像是您试图过度优化很少需要优化的东西。首先将您的成本写入可靠,其次是您或其他人可维护,然后在您获得需要优化的证据后仅优化真正需要优化的内容。

首先,让事情真正变得私密会增加复杂性。除非您真的非常需要隐私,否则您可能应该使用成员变量。

其次,实现隐私的闭包确实需要某种内存消耗成本。每次使用的内存量很小,所以如果你真的需要隐私(第一点),那么除非你有很多这样的闭包,否则你可能甚至不会注意到额外的消耗。

第三,如果您有很多这样的对象(例如数千个)并且您怀疑内存消耗实际上可能是一个重要问题,那么您可能应该在几个流行的浏览器中进行快速内存测试(一个带有私有闭包的版本和一个更简单的公共成员变量)来看看有多大的区别。差异是特定于实现的,因此从一个浏览器到下一个浏览器可能会有很大差异。

根据这些测量的结果,您可以决定走哪条路。

如果您没有数千个这样的对象,那么请尽可能以最简单的方式编写代码,以实现您的目标,并花时间处理在您运行应用程序后向您展示它们真正重要的事情。

于 2012-07-16T03:47:17.977 回答