javascript 我们应该尽可能共享函数还是创建新函数?

标签 javascript web-services

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

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/

相关文章:

java - 验证 SOAP 响应 xml 时间戳和签名 X509 spring-ws-security

javascript - Array.includes 不能像 string.includes 一样工作

javascript - 形式参数后缺少 jquery/javascript )

javascript - 访问 url [material-ui + tabs] 时 Angular Ui Router 不加载 View

java - CommandLineRunner 和 Springboot 与 Hibernate 的问题 - 无法初始化代理 session - 无 session

java - 为什么我们使用 <cxf :rsServer> as opposed to a plain <jaxrs:server> when using the CXF-RS component?

javascript - 如何更新登录 Chrome 控制台的变量

javascript - 如何在 Ubuntu 15.04 上运行 johnny- Five ?

.net - Web服务日志记录

c# - 无法导入 WSDL 服务 "targetNamespace ' urn :webservice' not found'