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