编译器会在可能的情况下将对实例方法的调用优化为静态方法吗?
Will the compiler optimise calls to instance methods into static ones where it can?
假设我有类似的东西:
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
}
答案是编译器可能不会这样做,因为没有真正的优化。
一个对象的方法列表保存在一个单独的 table 中,该对象在所有对象实例之间共享,因此从 table 中删除一个方法对内存使用的影响很小.
"static" 版本可能会使调用更高效一些,因为它不需要通过此函数间接调用 table,但不确定 JIT 编译器是否会生成更高效的代码在这种情况下。
因此,一如既往,您应该编写最能表达您想要达到的效果的代码,并且只有在您有经验证据表明这会对您的解决方案产生真正影响时才担心性能。当您进行优化时,请在担心详细的语言问题之前正确使用算法。
假设我有类似的东西:
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
}
答案是编译器可能不会这样做,因为没有真正的优化。
一个对象的方法列表保存在一个单独的 table 中,该对象在所有对象实例之间共享,因此从 table 中删除一个方法对内存使用的影响很小.
"static" 版本可能会使调用更高效一些,因为它不需要通过此函数间接调用 table,但不确定 JIT 编译器是否会生成更高效的代码在这种情况下。
因此,一如既往,您应该编写最能表达您想要达到的效果的代码,并且只有在您有经验证据表明这会对您的解决方案产生真正影响时才担心性能。当您进行优化时,请在担心详细的语言问题之前正确使用算法。