【问题标题】:Alternative to bind function?替代绑定功能?
【发布时间】:2017-08-15 04:12:53
【问题描述】:

所以我正在阅读有关 V8 代码的函数式编程和优化的内容,我决定检查 bind 函数是否可以被 V8 优化?

所以我阅读了原生 javascript 代码并被这些代码行所击中,

 var newfn = function() {
    // Combine the static args and the new args into one big array
    var args = boundargs.concat(Array.prototype.slice.call(arguments));
    return fn.apply(self, args);
  };

这行代码清楚地表明,根据 MDN,对 arguments 对象的处理将导致返回的函数无法被 v8 优化。 所以问题是我可以使用他们的任何原生替代绑定吗?

资源

【问题讨论】:

  • 你是说这段代码是V8中.bind()的内置实现的一部分吗?如果是这样,你能提供一个链接参考吗?
  • 有一些方法可以避免使用.bind(),但这些方法取决于实际的编程使用上下文,所以我们需要看到它才能提供这些替代方案(例如箭头函数或闭包) .
  • 您是如何得出 V8 不能/不优化 bind() 或绑定函数的结论的?你的证据在哪里?
  • 我在这个 V8 存储库中找不到您的代码参考:github.com/v8/v8。我确实发现 C++ 代码看起来可能是 .bind() 相关 here
  • 而且,this V8 code reference 看起来像是在定义 Function.prototype.bind 以在我的 previous code reference 中使用 C++ 代码 FastFunctionPrototypeBind。所以,我的结论是你的bind() 代码参考不是V8 使用的。 V8 使用原生代码实现,不会出现您提到的优化问题。

标签: javascript node.js optimization native v8


【解决方案1】:

我会尝试将我的 cmets 总结为一个答案。

您的问题引用了一些实现 Function.prototype.bind() 之类的 Javascript 代码,它来自 Chromium 存储库。老实说,我不知道该代码的来源,但是当我查看代表 V8 上当前活跃开发的 V8 repository 时(据我所知),您引用的代码无处可寻。我查看了 V8 存储库中关于“绑定”的 35 页搜索命中,并搜索了您引用的代码中 cmets 中存在的几个有些独特的词,但我在当前的 V8 存储库中找不到它们。

而且,在current V8 repositoryherehere 中有几个类似Function.prototype.bind 功能的“本机代码”C++ 实现。

因此,我的结论是,您从 Chromium 引用的类绑定 Javascript 代码当前不是 V8 的一部分,并且 V8 使用不存在 JS 优化问题的 Function.prototype.bind 的本机 C++ 代码实现。因此,您关于寻找替代品的问题并不真正有效,因为 Function.prototype.bind 的内置实现似乎没有您担心的任何优化问题。


我熟悉您链接到的优化文档,以及您必须非常小心如何使用 arguments 对象以避免破坏一些 Javascript 优化。但是,该问题不适用于在本机 C++ 代码中完成的 Function.prototype.bind 实现,因为这些优化问题仅适用于用 Javascript 编写的代码,而不适用于用 C++ 编写的代码。

【讨论】:

  • 非常正确,如果它是用 C++ 实现的。我现在想到的问题是,v8 是编译原生 JavaScript 库还是有 C++ 代码。我立即得出结论,它可能正在编译 JS 库,因为我在其中一个资源中使用了我发送的 V8 在 Chromium 中使用的资源,所以这里的 V8 案例可能只是一个编译器,在这种情况下它编译原生 JS 库。正如我之前所说,你也有一个观点,但没有一个是决定性的
  • 这里是 V8 开发者。这个答案是正确的。原始问题中引用的代码不是,也从来不是 V8 的一部分。 (它是一些托管在 chromium.org 服务器上的项目使用的一些 polyfill;它甚至不在浏览器本身中。) -- V8 有一个高度优化的Function.prototype.bind 实现。 -- 大多数“优化杀手”文档已经过时,因为 V8 发布了新的优化编译器“Turbofan”。
  • @HeshamAdel - 请参阅 V8 开发人员之前的评论。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2020-09-03
  • 2021-06-16
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多