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

标签 performance scala logging callbyname

我最近一直在研究各种 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/

相关文章:

c - 为什么初始化 gl3w 比初始化 GLEW 快得多?

c - 在 x86 上写入比读取快?

scala - 编译 Play 应用程序时出现的问题

scala - 加一链表: Functional Approach

generics - 关于 Scala 泛型的简单问题

android - 在 Android 中捕获完整的日志

c++ - 在 C++ 中,引用总是更好的选择吗?

mysql - 在 SQL 查询中使用 "AND"和 "OR"

Django 调试工具栏日志记录

ios - os.log 是做什么用的?