cats 和 scalaz 是否会对应用程序产生性能开销?

MHJ*_*MHJ 1 functional-programming scala scalaz scala-cats

我知道这完全是一个无意义的问题,但由于我对编程技能的文盲,这个问题浮现在我的脑海中。使用 Cats 和 scalaz,以便我们可以像 Haskell 那样以纯函数式编程方式在 Scala 中进行编码。但为了实现这一目标,我们需要在我们的项目中额外添加这些库。最终,为了使用它们,我们需要用它们的对象和函数来包装我们的代码。它是添加额外代码和依赖项的东西。我不知道这些是否会在内存中创建更大的对象。这些都让我思考。所以我的问题是:如果我使用 cats/scalaz ,我会面临任何性能问题,例如更多内存消耗吗?或者如果我的应用程序需要性能,我应该避免这些吗?

Lui*_*rez 5

cats 和 scalaz 是否会对应用程序产生性能开销?

绝对地。

就像任何一行代码都会增加性能开销一样。
所以,如果这是您关心的问题,那么就不要编写任何代码(好吧,实际上,如果我们从未尝试过这一切,世界可能会更简单)

现在,迪克在外面回答。您应该问的正确问题是:“X 库的开销对我的软件有害吗?” ; 请记住,这适用于任何库,实际上适用于您编写的任何代码,您选择的任何算法等。

而且,为了回答这个问题,我们之前需要做一些事情。

  1. 定义您正在编写的软件必须具备的 SLO。如果没有这些,您所做的任何性能问题/观察都是毫无意义的。如果您不知道某件事对您和您的客户是否有意义,那么速度更快/更慢并不重要。
  2. 有了 SLO 后,您需要执行压力测试来验证当前版本的软件是否满足这些要求。因为,如果您当前的代码性能足够,那么您应该担心其他事情,例如可维护性、测试、添加更多功能等。
    PS:请记住,这些 SLO 不应该是原始数字,而应该以百分位数表示,同样如此以获得测试结果。
  3. 当您发现您的 SLO 不合格时。然后,您需要进行适当的基准测试和调试来识别项目的瓶颈。正如您所看到的,必须在每一行代码上关注性能,但这是大量工作,通常不会产生任何相关输出。因此,我们不是评估所有内容的性能,而是首先找到瓶颈,即应用程序中对软件整体性能贡献最大的那些小部分(记住帕累托原则)
    请记住,在这一步中,我们必须是完整的,网络也很重要。(您会发现最后一个通常是最大的减速;因此,您通常会搜索架构解决方案,而Fibers不是Threads尝试优化小功能。此外,有时更简单和更便宜的解决方案是更好的基础设施)
  4. 当您发现瓶颈时,您需要制定一些替代方案,实施这些替代方案,不仅对它们进行基准测试,而且进行统计假设检验以验证提议的更改是否值得。当然,还要验证它们是否足以满足 SLO。

因此,正如你所看到的,表演是一门艺术,也是一项艰巨的工作。因此,除非您致力于完成所有这一切,否则请不要担心无法正确衡量和优化的事情。相反,应该专注于提高代码的可维护性。这实际上也有助于提高性能,因为当您发现需要更改某些内容时,您会感激代码尽可能干净并且代码的整个架构允许轻松更改。

并且,请相信我,使用catscats-effectfs2等工具将在这方面有所帮助。此外,它们实际上在其核心上进行了相当优化,因此您应该适合很多用例。


现在,最大的例外是,如果您知道您正在做的工作将非常受 CPU 和内存限制,那么您几乎可以确定所有这些抽象都会有害。在这些情况下,您甚至可能希望远离 JVM ,而使用Rust这样的语言编写相当低级的代码,它将为您提供解决此类问题的适当工具,并且仍然比普通的旧C更安全。

  • @John 维护一种语言是一项极其困难的任务。您不能简单地将所有内容构建到语言中。极简主义,就像许多事情一样,是关键。与像 Haskell 这样致力于成为函数式语言的语言不同,Scala 的目标之一是成为一种灵活的语言,拥有足够强大的类型系统来支持不同类型的程序设计,从经典的面向对象到纯函数式以及介于两者之间的一切。支持每一种可能的编程范式是很困难的,因此该语言为他们提供了工具,并将其留给社区来构建这些工具 (2认同)
  • @John Luis 的回答令人惊叹,但我想添加以下资源,因为我认为它们是相关的。[为什么光纤速度这么快?作者:Daniel Spiewak](https://typelevel.org/blog/2021/02/21/ Fibers-fast-mkay.html),[猫效应 3,作者:Daniel Spiewak](https://www.youtube.com/watch ?v=KZtVBtOrP50&t=2095s) 最后有一整部分是关于表演的。请注意,这是专门针对猫效应的。原始问题中没有提到,但答案中引用了这一点。 (2认同)