Scala - 调用“第一类函数”的开销

时间:2011-08-19 11:34:00

标签: performance scala

首先,请随意更正我的问题标题,我对功能编程术语不太熟悉。

我的问题是,将函数作为“变量内容”处理是否有任何开销(以及它有多重要)。例如,在以下代码中:

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 个答案:

答案 0 :(得分:11)

当您将函数指定为值时,创建的对象是其中一个Function类的实例(Function1如果它采用单个参数,Function2如果它需要两个参数,等等。 )。实际上调用该函数只需要在apply对象上调用FunctionN方法。

在这方面,除非你正在寻找关键循环,否则开销真的很小。从理论上讲,创建一个对象来表示函数 - 一个没有内部状态,一个非常小的类(包含或多或少只是实现你的函数的代码)。由于使用此对象的方式有限,我希望Hotspot能够在此处应用大量优化。然后,与apply语句相比,将对函数的match方法进行额外的方法调度。同样,这是一个固定的(和常见的)模式,我希望它可以进行相当多的优化。


基本上,任何开销都可以忽略不计。与所有优化一样,在您确定它是性能瓶颈之前,以人为简洁/不太自然的方式编写代码为时尚早。

如果性能确实是一个关键问题,那么你最终可能会选择比 选项更优化的东西。

在此期间,放松并享受一流功能带给您的“好感”!