我的主要问题如下:
当你有一个时,information hidding会伤害性能(CPU /内存) 经常访问的函数(返回一个对象) 人们互动?
或者这被认为是微优化,尤其是在使用像 node.js(长时间运行的流程)这样的平台时。我是否应该考虑表现而非信息隐藏?
通过阅读Douglas Crockford's article about information hidding我知道我可以添加私有成员和特权方法。但根据Douglas Crockford的引用,原型机制可以帮助你保存记忆:
当一个成员被寻找并且在对象本身中找不到时,那么 它取自对象的构造函数的原型成员。该 原型机制用于继承。它也节省了记忆。
当只保存内存时,我想这可能不是什么大问题,因为内存越来越便宜了。但是根据this article from John Resig,在原型链中添加很多属性也更快(CPU)。
因此,如果你有一个经常访问的函数(返回一个对象) 你希望人们与之互动,那么这对你有利 让对象属性在原型链中并实例化 它
使用一堆原型属性实例化一个函数是非常的, 非常快。它彻底打击了模块模式,类似的,出来了 的水。因此,如果您有一个经常访问的功能 (返回一个对象),你希望人们与之交互,然后是 将对象属性放在原型中是有利的 链并实例化它。
// Very fast function User(){} User.prototype = { /* Lots of properties ... */ }; // Very slow function User(){ return { /* Lots of properties */ }; }
这也可能不是一个大问题,因为CPU的速度要快得多(摩尔定律)。此外,因为Javascript引擎在性能方面取得了令人难以置信的进步,我想知道我是否应该考虑这个或者只是使用信息隐藏。
我猜也有这个子问题:
我如何使用类似的平台有效地测量内存和CPU 示例node.js?
答案 0 :(得分:2)
这肯定听起来像是你试图过度优化很少需要优化的东西。首先要确保您的成本是可靠的,其次是您或其他人可以维护,然后在得到需要优化的证据之后,仅优化真正需要优化的事物。
首先,让事情真正私密化会增加复杂性。您应该使用成员变量,除非您确实需要隐私。
其次,实现隐私的关闭确实会产生某种内存消耗成本。每次使用的内存量很小,所以如果你真的需要隐私(第一点),那么除非你有很多这样的关闭,你甚至可能不会注意到额外的消费。
第三,如果你有很多这些对象(例如数千个)并且你怀疑内存消耗可能实际上是一个重要的问题,那么你可能应该在几个流行的浏览器中进行快速内存测试(一个版本的私有闭包和一个更简单的公共成员变量),看看它有多大差异。差异是特定于实现的,因此从一个浏览器到下一个浏览器可能会有很大差异。
根据这些测量的结果,您可以决定走哪条路。
如果您没有数千个这样的对象,那么以最简单的方式编写代码来实现您的目标,并花时间处理显示一旦您运行应用程序时它们真正重要的事情。