cats 和 scalaz 会给应用程序带来性能开销吗?

问题描述 投票:0回答:1

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

scala functional-programming scalaz scala-cats
1个回答
5
投票

cats 和 scalaz 会给应用程序带来性能开销吗?

绝对可以。

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

现在,迪克在外面回答。您应该问的正确问题是:“X 库的开销对我的软件有害吗?”;请记住,这适用于任何库,实际上适用于您编写的任何代码,您选择的任何算法等。 并且,为了回答这个问题,我们之前需要做一些事情。

定义您正在编写的软件必须具备的 SLO。如果没有这些,您所做的任何性能问题/观察都是毫无意义的。如果您不知道某件事对您和您的客户是否有意义,那么速度更快/更慢并不重要。
  1. 一旦有了 SLO,您就需要执行压力测试来验证您当前的软件版本是否满足这些要求。因为,如果您当前的代码性能足够,那么您应该担心其他事情,例如可维护性、测试、添加更多功能等。
  2. PS:请记住,这些 SLO 不应是原始数字,而应以百分位数表示,测试结果也是如此。

  3. 当您发现自己的 SLO 未达标时。然后,您需要进行适当的基准测试和调试来识别项目的瓶颈。正如您所看到的,必须在每一行代码上关注性能,但这是大量工作,通常不会产生任何相关输出。因此,我们不是评估所有内容的性能,而是首先找到瓶颈,即应用程序中对软件整体性能贡献最大的那些小部分
  4. (记住帕累托原理)
  5. 请记住,在这一步中,我们必须是完整的,网络也很重要。 (您会发现最后一个通常是最大的减速;因此,您通常会搜索像
    Fibers 而不是
    Threads
    这样的架构解决方案,而不是尝试优化小功能。此外,有时更简单和更便宜的解决方案是更好的基础设施)
    .
    当您发现瓶颈时,您需要制定一些替代方案,实施这些替代方案,不仅对它们进行基准测试,还进行统计假设检验以验证所提出的更改是否值得。当然,还要验证它们是否足以满足 SLO。
  6. 因此,如您所见,表演是一门艺术,也是一项艰巨的工作。因此,除非您致力于完成所有这一切,否则请不要担心无法正确衡量和优化的事情。 相反,应该专注于提高代码的可维护性。这实际上也有助于提高性能,因为当您发现需要更改某些内容时,您会感激代码尽可能干净并且代码的整个架构允许轻松更改。

而且,请相信我,使用

cats

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

现在,最大的例外是,如果您知道您正在做的工作将非常受 CPU 和内存限制,那么您几乎可以确定所有这些抽象都会有害。在这些情况下,您甚至可能希望远离
JVM

,而是用 Rust 之类的语言编写相当低级的代码,这将为您提供解决此类问题的适当工具,并且仍然比普通的安全得多老C.

© www.soinside.com 2019 - 2024. All rights reserved.