Сможет ли компилятор оптимизировать вызовы методов экземпляра в состояния c, где это возможно? - PullRequest
0 голосов
/ 09 января 2020

Допустим, у меня есть что-то вроде:

case class StringList(list: List[String]) {

  final def isEmpty(): Boolean = list.isEmpty

}

Теоретически, компилятор Scala может оптимизировать вызовы метода isEmpty() и сделать их статическими c ... так, чтобы я не нужно написать это:

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

}

1 Ответ

3 голосов
/ 09 января 2020

Ответ в том, что компилятор, вероятно, не сделает этого, потому что никакой реальной оптимизации не будет.

Список методов для объекта хранится в отдельной таблице, которая используется всеми экземплярами. объекта, поэтому удаление одного метода из этой таблицы очень мало влияет на использование памяти.

Версия "stati c" может сделать вызов немного более эффективным, так как не требует косвенного прохождения через это таблица функций, но не уверен, что JIT-компилятор будет генерировать более эффективный код в этом случае.

Так что, как всегда, вы должны написать код, который наилучшим образом выражает эффект, которого вы хотите достичь, и беспокоиться только о том, о производительности, когда у вас есть эмпирические доказательства того, что это будет иметь реальное значение для вашего решения. А когда вы оптимизируете, разработайте алгоритмы, прежде чем беспокоиться о проблемах с языком.

...