为什么单态和多态在 JavaScript 中很重要?

2023-12-19

我一直在阅读一些有关更改检测的文章,它们都说单态函数比多态函数快得多。例如,这里有一个引用:

(..)这样做的原因是,它必须以动态方式编写,所以 它可以检查每个组件,无论其模型结构如何 喜欢。虚拟机不喜欢这种动态代码,因为它们不能 优化它。它被认为是多态的对象的形状 并不总是一样的。 Angular 在以下位置创建变更检测器类 每个组件的运行时,它们是单态的,因为它们知道 组件模型的形状到底是什么。虚拟机可以完美地 优化此代码,使其执行速度非常快。好的 问题是我们不必太关心这个,因为 Angular 会自动执行此操作。(..)

Source http://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html

现在,我试图找到单态与多态的例子,但在任何地方都找不到。有人能解释一下其中的区别吗?为什么它更快?


答案在于虚拟机可以对“热函数”进行启发式检测,即执行数百甚至数千次的代码。如果函数的执行计数超过预定限制,VM 优化器可能会选取该代码位并尝试根据传递给函数的参数编译优化版本。在这种情况下,它假定您的函数将始终以相同的方式调用type参数(不一定是same对象)。

其原因在此有详细记录v8特定指南文档 https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#some-v8-background其中解释了整数与一般数字优化。假设你有:

function add(a, b) { return a + b; }

...并且您总是使用整数调用此函数,可以通过编译一个在 CPU 上执行整数求和的函数来优化此方法,该函数速度很快。如果在优化后您向其提供非整数值,则虚拟机将取消优化该函数并回退到未优化的版本,因为它无法对非整数执行整数求和,并且该函数将返回错误的结果。

在指定重载单态方法的语言中,您可以通过简单地编译具有不同参数签名的同一方法名称的多个版本来解决此问题,然后对其进行优化。这意味着您调用不同的优化方法,因为使用不同类型的参数需要您使用不同的重载方法,因此不存在您使用哪种方法的问题。

您可能认为可以在虚拟机中保留优化函数的多个副本,并检查类型以确定要使用哪个优化的编译函数。理论上,如果方法调用之前的类型检查是免费的或非常便宜的话,那么这是可行的。在实践中,情况通常并非如此,您可能希望根据实际代码进行平衡,以确定最佳权衡阈值。

这里有一个更通用的解释,特别是 v8 的优化编译器(来自 Google I/O 2012):

https://youtu.be/UJPdhx5zTaw?t=26m26s https://youtu.be/UJPdhx5zTaw?t=26m26s

简而言之:一遍又一遍地调用相同类型的函数在 JIT 编译器中进行了优化,因此速度更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么单态和多态在 JavaScript 中很重要? 的相关文章

随机推荐

  • PHP foreach循环每2个项目包装一次

    div class puffar div
  • OpenCV无法绘制关键点

    我尝试运行所示的示例代码ORB in the openCV页 首先我必须弄清楚问题cv2 ORB 变成cv2 ORB create 出现此错误后 出现以下内容 Traceback most recent call last File orb
  • 将自定义信息添加到 HockeyApp 崩溃报告中

    我将我的 iOS 应用程序与 HockeyApp 平台集成 一切正常 但我需要添加一些额外的信息 例如来自 NSLog 的文本 以崩溃报告 有可能的 我不想使用外部框架 NSLogger CocoaLumberjack 数据库 服务器 We
  • js动态访问私有字段(属性/成员)

    我正在尝试新的类私有成员特征 https developer mozilla org en US docs Web JavaScript Reference Classes Class fields Private fields 然而 我很
  • EF4 可以为我生成 POCO,还是我必须自己编写它们?

    我最近一直在研究 Entity 4 框架 它非常漂亮 我已经设置了一个名为 Customer cs 的类 其中包含一些属性 例如名称 地址等 我还有一个名为 StoreEntities cs 的类 它通过 DbSet 将这些属性绑定回数据库
  • Python排序——对象列表

    如果可能的话 我想使用 somelist sort 方法来执行此操作 我有一个包含对象的列表 所有对象都有一个成员变量 resultType 它是一个整数 我想使用这个数字对列表进行排序 我该怎么做呢 Thanks somelist sor
  • 使用 MVVM 选择 ListView 中的所有项目

    我正在尝试选择所有Items in a ListView 使用 mvvm 使用代码隐藏 我尝试过全选 and foreach选择它们 但我想像项目的其余部分一样使用 MVVM 有任何想法吗 这是列表视图
  • 解析 request.object.existed() 返回 false

    我的解析有问题 我写了云代码 Parse Cloud afterSave Parse User function request var user request object if user existed all the times u
  • “git推送”和“git流放推送”有什么区别?

    我有一个 git 存储库 并且系统指示我执行以下操作序列 将给定的一组文件从文件夹复制到上述 git 存储库 源文件夹 不是存储库的一部分 Execute git add Execute git exile push folder name
  • 如何在反应日期中添加一年的选择?

    向右滑动几个月直到我到达正确的年份是很痛苦的react dates 是否有可能添加一些年份 月份的选择 是的 从版本开始是可能的 电子邮件受保护 cdn cgi l email protection 相关拉取请求 https github
  • gcc include 顺序损坏?

    我遇到了一个奇怪的问题 linux c 编译器包含本地目录而不是系统目录中的文件 使用 H 选项查看预编译器输出 可以看到系统文件 usr include sched h突然包括time h来自本地目录而不是系统一的标头 我假设如果包含文件
  • powershell 无法向 Excel 图表添加多个图例条目(系列)

    我在通过 powershell 将多个系列添加到 Excel 图表对象中的系列集合时遇到问题 这是我的代码 threading thread CurrentThread CurrentCulture en US excel New Obje
  • 带有 BroadcastReceiver 的清单中的 ACTION_USER_PRESENT

    对于是否可以通过清单捕获 ACTION USER PRESENT 屏幕解锁似乎存在不同意见 该线程暗示不 它不能完成 Android 广播接收器不工作 https stackoverflow com questions 6698716 an
  • 使用 Scala 中的原始类型实现 Java 接口

    我正在尝试使用 Scala 构建 Sonar 的扩展 我需要扩展以下 Java 接口 public interface Decorator extends BatchExtension CheckProject void decorate
  • 使用 NSKeyedUnarchiver 解码时出现问题

    我正在 XCode 3 2 3 上编写一个针对 iOS 4 0 的应用程序 当应用程序关闭时 我使用 NSCoder 协议存储一些数据 保存似乎工作正常 问题是从保存的文件中检索数据 我的保存方法如下所示 void saveMusicalW
  • 如何将 TrueType 字体转换为 PCL5 Soft 字体?

    如何将 TrueType 字体转换为 PCL5 softfont spf 主要思想是将软字体嵌入到 PCL5 打印文件中 然后选择它供打印机使用 因为它是通过 PCL5 命令指定的字体 ID 另外 如果您知道在创建 PCL5 文件时使用 T
  • 在 C++11 中使用没有托管共享指针的shared_from_this()

    假设我有一个类 它是enable shared from this 的子类 这个基类的文档说在调用shared from this之前应该有一个拥有这个类的共享指针 用new分配类并调用shared from this来管理对象是否安全 正
  • 解析不同架构维度输入的所有可能类型

    我正在为我们公司的产品编写一个库 它将采用我们的用户已经熟悉的任何类型的架构维度作为从字符串转换为双精度的函数的输入 这是我们希望有效的输入类型列表 Input 意义 Output 英寸以双精度表示 12 5 12 英尺 6 英寸 150
  • C# WPF - 窗口中的黑线

    我的窗户上有一条小黑线 为什么
  • 为什么单态和多态在 JavaScript 中很重要?

    我一直在阅读一些有关更改检测的文章 它们都说单态函数比多态函数快得多 例如 这里有一个引用 这样做的原因是 它必须以动态方式编写 所以 它可以检查每个组件 无论其模型结构如何 喜欢 虚拟机不喜欢这种动态代码 因为它们不能 优化它 它被认为是