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

Arg*_*Arg 6 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)
}
Run Code Online (Sandbox Code Playgroud)

真的很好,相比之下:

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

  def process(c: AnyRef) = {
    c match {
      case c: Bears ....
      .
      .
      .
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它会表现得更差吗?(显然它需要更多的内存,因为地图)

谢谢你的回答!

And*_*yle 11

将函数指定为值时,创建的对象是其中一个Function类的实例(Function1如果它接受一个参数,Function2如果它接受两个参数,等等).实际上调用该函数只是applyFunctionN对象上调用该方法.

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


从本质上讲,任何开销都可以忽略不计.与所有优化一样,以人为简洁/不太自然的方式编写代码为时尚早,直到您发现它是性能瓶颈为止.

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

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