首页 > 解决方案 > 编译器会尽可能将实例方法的调用优化为静态方法吗?

问题描述

可以说我有类似的东西:

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

}

标签: scalascala-compiler

解决方案


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

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

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

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


推荐阅读