Scala - накладные расходы на вызов «функций первого класса» - PullRequest
6 голосов
/ 19 августа 2011

Прежде всего, пожалуйста, не стесняйтесь исправлять заголовок моего вопроса, я не слишком знаком с языком функционального программирования.

Мой вопрос, есть ли какие-либо издержки (и насколько они важны?)) рассмотрения функций как «содержимого переменных».Например, в следующем коде:

class Processor {
  val map = Map[Class[_],AnyRef => Something](...)

  def process(c:AnyRef):Something = map(c.getClass)(c)
  def worksFor:List[Class[_]] = map.map(_._1)
}

действительно хорош, по сравнению с:

class Processor {
  def worksFor = List(classOf[Bears], classOf[Beets], classOf[BattlestarGalactica])

  def process(c: AnyRef) = {
    c match {
      case c: Bears ....
      .
      .
      .
    }
  }
}

но будет ли он работать хуже?(Очевидно, это займет больше памяти из-за карты)

Спасибо за любой ответ!

1 Ответ

11 голосов
/ 19 августа 2011

Когда вы присваиваете функцию как значение, созданный объект является экземпляром одного из классов Function (Function1, если он принимает один аргумент, Function2, если он принимает два аргумента и т. Д.).На самом деле вызов функции - это всего лишь вопрос вызова метода apply для объекта FunctionN.

В этом отношении действительно очень мало накладных расходов, если только вы не смотрите на критический цикл.Теоретически, объект создается для представления функции - объекта без внутреннего состояния и очень маленького класса (содержащего, в большей или меньшей степени, только код для реализации вашей функции).Из-за ограниченного способа использования этого объекта, я ожидаю, что Hotspot сможет применить здесь много оптимизаций.Затем будет отправка дополнительного метода к методу apply функции по сравнению с оператором match.Опять же, это фиксированный (и общий) шаблон, так что я ожидаю, что его можно оптимизировать довольно много.


По сути, любые издержки будут незначительными.Как и во всех оптимизациях, было бы преждевременно писать ваш код искусственно сжатым / менее естественным способом, пока вы не определили, что это узкое место в производительности.в конечном итоге вы захотите получить что-то более оптимизированное, чем или .

А пока расслабьтесь и наслаждайтесь "приятностью", которую дают вам первоклассные функции!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...