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

scala – 使用lazy val缓存字符串表示形式

发布时间:2020-12-16 08:52:49 所属栏目:安全 来源:网络整理
导读:我在JAXMag的 Scala特殊问题中遇到了以下代码: package com.weiglewilczek.gameoflifecase class Cell(x: Int,y: Int) { override def toString = position private lazy val position = "(%s,%s)".format(x,y)} 在上面的代码中使用lazy val是否比下面的代
我在JAXMag的 Scala特殊问题中遇到了以下代码:

package com.weiglewilczek.gameoflife

case class Cell(x: Int,y: Int) {
  override def toString = position
  private lazy val position = "(%s,%s)".format(x,y)
}

在上面的代码中使用lazy val是否比下面的代码提供了更多的性能?

package com.weiglewilczek.gameoflife

case class Cell(x: Int,y: Int) {
  override def toString = "(%s,y)
}

或者只是一个不必要的优化案例?

解决方法

关于延迟val的一件事是,虽然它们只计算一次,但每次访问它们都受到双重检查锁定包装的保护.这是必要的,以防止两个不同的线程尝试同时使用热闹的结果初始化值.现在,双重检查锁定非常有效(现在它实际上在JVM中工作),并且在大多数情况下不需要锁定获取,但是比简单的值访问有更多的开销.

此外(并且有些明显),通过缓存对象的字符串表示,您可以明确地讨论CPU周期,以便可能大幅增加内存使用量. “def”版本中的字符串可以被垃圾收集,而“lazy val”版本中的字符串则不会.

最后,正如性能问题一样,基于理论的假设在没有基于事实的基准测试的情况下几乎没有任何意义.如果没有剖析,你永远不会知道,所以不妨试试看看.

(编辑:李大同)

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

    推荐文章
      热点阅读