gpt4 book ai didi

按值调用与按名称调用在 Scala 日志记录库中的性能

转载 作者:行者123 更新时间:2023-12-04 06:42:47 24 4
gpt4 key购买 nike

我最近一直在研究各种 Scala 日志库,其中绝大多数实现了它们的日志功能

def debug(s: => String)

这样,如果您关闭了调试日志记录,它就不会执行该语句。然而,我刚刚遇到 logula其中特别说明它的好处之一

Unlike a lot of Scala logging libraries, Logula doesn't use pass-by-name semantics (e.g., f: => A) for its logging statements, which means two things:

  • The Scala compiler doesn't have to create one-off closure objects for each logging statement. This should reduce the amount of garbage collection pressure.


这对我来说实际上完全有意义。所以我的问题是,是否有任何真实世界的性能基准/数据比较这两种方法?理想情况下,来自实时项目与人为基准的东西?

最佳答案

哪个更快完全取决于用例。如果您正在记录静态字符串,那么只需传入该常量字符串并忽略它会更快。否则,如果您要创建字符串,则无论如何都必须至少创建一个对象。函数对象又小又便宜——如果你想忽略它,你最好创建一个而不是字符串。

就个人而言,我认为这种对权衡的第一性原理理解比对可能使用了其中一个的特定应用程序的案例研究更有值(value),因为它可以让您了解为什么要选择一个或另一个(以及您仍然希望对自己的应用程序进行基准测试)。

(注意:创建对象的成本取决于垃圾收集器的影响程度;通常,可以以每秒 108 个数量级的速度创建和处理短期对象,这应该不是问题,除非在紧密的内部循环中。如果您将日志记录语句放在紧密的内部循环中,我认为有些问题。您应该为此编写单元测试。)

关于按值调用与按名称调用在 Scala 日志记录库中的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11744942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com