当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 更快地实现Option.isEmpty?

来源:互联网 收集:自由互联 发布时间:2021-06-22
Option在 Option中的实施很简单 – 这是一个草图: abstract class Option[+A] { def isEmpty:Boolean }object None extends Option[Nothing] { def isEmpty=true }final class Some extends Option[+A] { def isEmpty=false } isEmpty被大量
Option在 Option中的实施很简单 – 这是一个草图:

abstract class Option[+A]           { def isEmpty:Boolean  }
object None extends Option[Nothing] { def isEmpty=true }
final class Some extends Option[+A] { def isEmpty=false }

isEmpty被大量使用,包括Option本身,所以它的性能很重要,即使它是如此微不足道.

我怀疑实现它会更快:

abstract class Option[+A] { final def isEmpty = this eq None  }

此实现不应要求取消引用该选项或调用其上的任何方法,AFAIK – 只是一个简单的参考比较.

我对它进行了性能测试,但JVM微基准测试非常棘手,我对创建有意义结果的能力毫无信心.

我有什么因素可以忽略吗?

实际上,你可能是对的.使用以下代码:

sealed abstract class Opshun[+A] {
  final def isEmpty = this eq Nun
  def get: A 
}
object Nun extends Opshun[Nothing] { def get = ??? }
case class Summ[+A](get: A) extends Opshun[A] {}

在最简单的测试用例(Option或Opshun数组)中,如果您所做的只是测试isEmpty,那么您建议的模式是5x(!)更快,如果您手动将.isEmpty替换为eq None或模式,则可以验证这一点匹配挑选无.

如果你转向更复杂的情况,你测试not-isEmpty然后得到一个存储值,差异就不那么令人印象深刻了(快三分之一).

所以这个建议有价值;它值得在更官方的环境中进行测试.

注意在编辑中添加:这是使用足够大的数组,以便不是所有内容都适合L2缓存.当它适合L2时,两种方式都同样快.

网友评论