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被大量
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时,两种方式都同样快.