加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala日志库中的性能按值调用vs按名称调用

发布时间:2020-12-16 09:00:55 所属栏目:安全 来源:网络整理
导读:我最近一直在查看各种 scala日志库,其中绝大多数都实现了日志记录功能 def debug(s: = String) 因此,如果您关闭了调试日志记录,它将不会执行该语句.然而,我刚刚遇到了logula,它特别指出了它的一个好处 Unlike a lot of Scala logging libraries,Logula doesn
我最近一直在查看各种 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.

这实际上对我来说很有意义.所以我的问题是,是否存在比较这两种方法的真实世界性能基准/数据?理想情况下,从现场项目到人工基准测试?

解决方法

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

就个人而言,我认为这种对权衡的第一原则理解甚至比对某个特定应用的案例研究更有价值,因为它可以让你理解为什么选择其中一个(和你仍然总是希望对自己的应用程序进行基准测试.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读