我想知道哪种情况有更多的“开销”:
1) 案例 1:500 万个对象共享 30 个函数。每次调用函数时,都会有开销,因为需要执行 f.call(instance, arg1, arg2, etc)
//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
查找,您绝对应该去分享方法。
用简单的话描述的优化技术是一种散列查找表
,javascript 引擎使用它从范围外
变量访问属性/方法。因此,与引擎必须遍历每个父作用域变量/激活对象的经典作用域链查找
相比,开销非常小。
这种优化的查找
只会失败,如果有某种直接的eval
代码。由于 eval
可以从上下文更改属性,因此引擎必须回退到经典的查找算法(这有点慢)。
但是,5m 个对象对于 Javascript 引擎来说有点不真实,我希望这些数字只是示例。在真实场景中,调用 n
个函数的 5m 个对象会造成堆栈溢出和到处都是“运行脚本时间过长”的错误。
光是 1.5 亿个函数的解析时间
就很可耻。
关于javascript 我们应该尽可能共享函数还是创建新函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6148920/