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

information hidding in Javascript will sacrifice performance?

本文关键字:牺牲 性能 信息 隐藏 Javascript      更新时间:2023-09-28

我的主要问题如下:

当你有一个所需的频繁访问函数(返回对象)与之互动的人?

或者,这被认为是微优化,尤其是在使用node.js(长时间运行的进程)这样的平台时。我是否应该考虑性能而不是信息隐藏?


通过阅读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引擎在性能方面取得了令人难以置信的进步,我想知道我是否应该考虑这一点,或者只是使用信息隐藏。


我想我还有一个子问题:

如何使用类似的平台有效地测量内存和CPUnode.js示例?

这听起来确实像是你试图过度优化一些很少需要优化的东西。让你的成本首先是可靠的,其次是可由你或他人维护,然后在你得到需要优化的证据后,只优化真正需要优化的东西。

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

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

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

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

如果你没有数千个这样的对象,那么就用最简单的方式编写代码,以实现你的目标,并在运行应用程序后花时间做一些事情,让你知道它们真的很重要。