使用 Sorbet 的 ruby 类型检查器会影响 ruby 应用程序的性能吗?

Will using Sorbet's ruby type checker have an impact on a ruby app's performance?

也许是新手的问题,但如果你不问,你永远不会知道

在 RoR 应用程序上使用 Stripe 的 Sorbet (https://sorbet.org/) 是否可以提高应用程序的性能? (性能意味着响应时间,而不是健壮性\运行时错误率)

我阅读了一些动态类型语言(特别是 Javascript 在这种情况下)并发现如果我们继续发送一些函数(例如 foo)相同类型的对象,引擎对该函数做了一些优化工作,因此当它以相同类型再次调用时,解释工作会更快。

我想也许 ruby 解释器会做类似的工作,这可能意味着类型检查可能会提高解释速度

您所说的优化更适用于正在为 ruby 运行时处理的 JIT。

一般来说,sorbet 的目标是 type-safety 通过引入类型接口或方法签名。他们启用在部署应用程序之前应用的静态 type-checks 以摆脱 "type errors".

sorbet 附带一个运行时组件,可以在运行时在您的可运行应用程序中强制执行类型检查,但这些会降低应用程序性能,因为它们包装 method-calls 以检查正确的类型 https://sorbet.org/docs/runtime#runtime-checked-sig-s

I thought maybe ruby interpreter does a similar work which can potentially mean that type-checking may increase interpreting speed

目前还没有,但有朝一日可能会建成。 与为计算机(编译器)构建类型系统相比,Sorbet 的目标是为人们构建类型系统。它可能会引入一些性能开销,但由于 Stripe 运行 在生产中使用它,我们会对其进行检查。在内部,如果开销超过 cpu 时间的 7%,我们就会呼叫我们。

I did some reading on dynamically typed languages (particularly Javascript in this case) and found out that if we keep sending some function (foo for example) the same type of objects, the engine does some optimising work on that function, so that when it is invoked again with the same types, there interpreting work would be quicker.

是的,这是可以做到的。您所描述的是 Just-In-Time(JIT) 编译器中的常见优化。您似乎提到的技术使用 运行 时间分析,实际上是一种常见的替代技术,可以在 不存在 类型系统中实现此结果。还值得注意的是,well-build JIT 比类型系统更频繁地执行此操作,因为类型系统对 可能 发生的事情进行编码,而分析和 JIT 可以针对 [=21] 进行优化=]实际发生在实践中。

也就是说,构建 JIT 的工作量通常比构建在线编译器多得多,因此,取决于人们希望在加速 Ruby 上投入的投资量,要么使用构建 JIT 要么使用类型在不同的 real-world 约束下可以证明更好。

I thought maybe ruby interpreter does a similar work which can potentially mean that type-checking may increase interpreting speed

总结上一段,Sorbet 类型系统目前没有加速 Ruby,但也不会减慢多少。 类型系统确实可以用来加速语言,但它们不是你唯一的工具,分析和 JIT 编译是主要的竞争对手。