使用Sorbet的红宝石类型检查器会对红宝石应用程序的性能产生影响吗?

时间:2019-07-08 09:24:55

标签: ruby performance sorbet

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

在RoR应用程序上使用Stripe的冰糕(https://sorbet.org/)是否可以潜在地改善应用程序的性能? (性能表示响应时间,而不是健壮性\运行时错误率)

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

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

2 个答案:

答案 0 :(得分:0)

您正在谈论的优化更多地应用于正在为ruby运行时而努力的JIT。

通常,冰糕通过引入类型界面或方法签名来实现类型安全。它们可以启用在部署应用程序之前应用的静态类型检查,以消除“类型错误”。

sorbet附带了一个运行时组件,该组件可以在运行时在可运行的应用程序中执行类型检查,但是由于包裹了方法调用以检查正确的类型https://sorbet.org/docs/runtime#runtime-checked-sig-s,它们将降低应用程序性能。

答案 1 :(得分:0)

  

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

还没有,但是有一天可能会建立。 与为计算机(编译器)构建类型系统相比,Sorbet的目标是为人们构建类型系统。它可能会带来一些性能开销,但是当Stripe在生产环境中运行它时,我们会对其进行检查。在内部,如果系统开销超过CPU时间的7%,我们就会向我们发送分页。

  

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

是的,可以这样做。您要描述的是即时(JIT)编译器中的常见优化。您似乎所指的技术使用运行时概要分析,并且实际上是一种常见的替代技术,该技术可在类型系统不存在的情况下实现此结果。还值得注意的是,构建良好的JIT可以比类型系统更频繁地执行此操作,因为类型系统对可能发生的事情进行编码,而配置文件和JIT可以针对实际中实际发生的事情进行优化< / em>。

也就是说,构建JIT通常比构建在线编译器要耗费更多的工作,因此,根据一个人想要投入的资金来加速Ruby的使用,无论是构建JIT还是使用类型,在不同的真实环境下使用JIT都可以证明是更好的选择。世界的约束。

  

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

总结前面的段落,Sorbet类型系统当前不加快Ruby的速度,但也没有减慢它的速度。 类型系统确实可以用来加速语言,但是它们并不是您唯一的工具,分析和JIT编译是主要竞争者。