Fal*_*rri 8 performance logging scala callbyname
我最近一直在关注各种scala日志库,其中绝大多数都实现了日志记录功能
def debug(s: => String)
Run Code Online (Sandbox Code Playgroud)
因此,如果关闭调试日志记录,它将不会执行该语句.但是,我刚刚遇到了logula,它特别指出了它的一个好处
对于其记录语句,这意味着两两件事:不像很多Scala的记录库,Logula不使用通过按姓名语义(=>阿例如,f):
- Scala编译器不必为每个日志记录语句创建一次性闭包对象.这应该减少垃圾收集压力.
这实际上对我来说是完全合理的.所以我的问题是,是否存在比较这两种方法的真实世界性能基准/数据?理想情况下,从现场项目到人为的基准测试?
哪个更快取决于用例.如果您正在记录静态字符串,那么只需传递该常量字符串并忽略它就会更快.否则,如果您正在创建字符串,则无论如何都必须创建至少一个对象.函数对象很小且很便宜 - 如果你要忽略它,你最好创建其中一个而不是字符串.
就个人而言,我认为这种对权衡的第一原则理解甚至比特定应用的案例研究更有价值,因为它可以使用其中一种,因为它可以让你理解为什么你会选择其中一种(和你仍然总是希望对自己的应用程序进行基准测试.
(注意:对象创建的成本有多大取决于垃圾收集器的影响程度;通常,可以以每秒10 8的速率创建和处理短期对象,这不应该是一个问题除了在紧密的内部循环中.如果你将日志语句放在紧密的内部循环中,我认为有些错误.你应该为此编写单元测试.)