Web 服务 - JavaScript 我们应该尽可能共享函数或创建新函数

web services - javascript should we share functions whenever possible or create new ones?

本文关键字:函数 创建 新函数 共享 尽可能 服务 JavaScript 我们 Web      更新时间:2023-09-26

我想知道哪种情况有更多的"开销":

1

(案例1:500万个对象共享30个功能。每次调用函数时,都会有开销,因为需要执行 f.call(instance、arg1、arg2 等(

 //example code
function makeObject()
{
  return { method1:func1,
           method2:func2,
           ...
           method30:func30 };
}

2( 情况 2:500 万个对象,每个对象有 30 个函数(= 1.5 亿个单独的函数实例(。每次调用函数时,都没有"路由开销",但当然要牺牲更多实例

//example code
function makeObject()
{
  return { method1:func1.bind(asd),
           method2:func2.bind(asd),
           ...
           method30:func30.bind(asd) };
}

500万只是我的手指打出的一个数字,而我的大脑仍在为一个例子找出一个不错的数字。

基本上,我想知道我们是否应该尽可能共享功能或创建新功能?

(你可以假设我永远不会在整个页面的任何地方使用 eval 函数(

由于几乎所有现代浏览器都优化了prototype-scopeschain查找,因此您绝对应该共享方法。

简单来说,优化技术是一种hash lookup table,javascript引擎使用它来从out of scope变量访问属性/方法。因此,与引擎必须爬取每个父作用域变量/激活对象的经典scope chain lookup相比,开销很小。

这种优化lookup只有在存在某种直接eval代码时才会失败。由于eval可以从上下文中更改属性,因此引擎必须回退到经典的查找算法(这有点慢(。

然而,500万个对象对于Javascript引擎来说是不真实的,我希望这些数字只是例子。在现实世界中,调用n多个函数的 5m 对象将创建堆栈溢出和"运行脚本太长"错误。

parsing time 1.5亿个功能将是可耻的。

如果假设情况 2 是关于创建类似于以下内容的对象:

function makeObject()
{
  return { method1:func1,
           method2:func2,
           ...
           method30:func30 };
}

然后,您将拥有 5m 个对象,每个对象有 30 个属性。不是"1.5 亿个单独的函数实例"。函数实例数仍将为 30。

创建 5m 的此类物体将花费您一些东西。添加属性比阅读它贵 3-10 倍左右。这意味着创建此类集合所需的时间可能比程序使用__proto__访问使用一级间接寻址的方法所花费的时间更多。

简而言之:对于 5m/30 的情况,在大多数情况下,1 更理想。但在某些情况下,将方法引用放入对象本身是值得考虑的。例如,有限数量的频繁访问对象/方法(例如单例(。

为什么不这样呢?

function myObject() { }
myObject.prototype.method1 = func1
myObject.prototype.method2 = func2,
           ...
myObject.prototype.method30 = func30

因此,如果您将对象创建为

var obj = new myObject();

然后,您将调用其方法为:

obj.method1(); 
obj.method2(); 

不需要call()和其他魔法...

在这种情况下,您不需要使用相同的 30 个属性填充对象的每个实例。