首先,请随意更正我的问题标题,我对功能编程术语不太熟悉。
我的问题是,将函数作为“变量内容”处理是否有任何开销(以及它有多重要)。例如,在以下代码中:
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 ....
.
.
.
}
}
}
但它的表现会更差吗? (显然,由于地图会占用更多内存)
感谢您的回答!
答案 0 :(得分:11)
当您将函数指定为值时,创建的对象是其中一个Function类的实例(Function1
如果它采用单个参数,Function2
如果它需要两个参数,等等。 )。实际上调用该函数只需要在apply
对象上调用FunctionN
方法。
在这方面,除非你正在寻找关键循环,否则开销真的很小。从理论上讲,创建一个对象来表示函数 - 一个没有内部状态,一个非常小的类(包含或多或少只是实现你的函数的代码)。由于使用此对象的方式有限,我希望Hotspot能够在此处应用大量优化。然后,与apply
语句相比,将对函数的match
方法进行额外的方法调度。同样,这是一个固定的(和常见的)模式,我希望它可以进行相当多的优化。
基本上,任何开销都可以忽略不计。与所有优化一样,在您确定它是性能瓶颈之前,以人为简洁/不太自然的方式编写代码为时尚早。
如果性能确实是一个关键问题,那么你最终可能会选择比 选项更优化的东西。
在此期间,放松并享受一流功能带给您的“好感”!