编译器是否会在可能的情况下将对实例方法的调用优化为静态方法?



假设我有这样的东西:

case class StringList(list: List[String]) {
final def isEmpty(): Boolean = list.isEmpty
}

从理论上讲,Scala 编译器可以优化对方法isEmpty()的调用,并使它们成为静态的......这样我就不必写这个:

object StringList {
implicit class StringListExtensions(val strList: StringList) extends AnyVal {
def isEmpty(): Boolean = strList.list.isEmpty
}
}

或者这个:

object StringList {
def isEmpty(strList: StringList): Boolean = strList.list.isEmpty
}

答案是编译器可能不会这样做,因为没有真正的优化。

对象的方法列表保存在一个单独的表中,该表在对象的所有实例之间共享,因此从该表中删除一个方法对内存使用量几乎没有影响。

"静态"版本可能会使调用更有效,因为它不需要间接通过此函数表,但不确定在这种情况下 JIT 编译器是否会生成更高效的代码。

因此,与往常一样,您应该编写最能表达您想要实现的效果的代码,并且只有在有经验证据表明这将对您的解决方案产生真正影响时才担心性能。当您进行优化时,在担心详细的语言问题之前,先正确使用算法。

相关内容

  • 没有找到相关文章

最新更新