隐藏在Javascript中的信息会牺牲性能吗?

时间:2012-07-16 03:31:12

标签: javascript node.js

我的主要问题如下:

  当你有一个时,

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?

1 个答案:

答案 0 :(得分:2)

这肯定听起来像是你试图过度优化很少需要优化的东西。首先要确保您的成本是可靠的,其次是您或其他人可以维护,然后在得到需要优化的证据之后,仅优化真正需要优化的事物。

首先,让事情真正私密化会增加复杂性。您应该使用成员变量,除非您确实需要隐私。

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

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

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

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