2011-08-19 58 views
6

首先,请随时纠正我的问题的标题,我不太熟悉函数式编程术语。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 .... 
     . 
     . 
     . 
    } 
    } 
} 

但它执行任何恶化? (显然它会占用更多的内存,因为地图)

感谢您的任何回答!

回答

11

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

在这方面,除非您正在寻找一个关键循环,否则确实有很少的开销。理论上,创建一个对象来表示这个函数 - 一个没有内部状态,一个非常小的类(包含或多或少只是实现函数的代码)。由于这个对象的使用方式有限,我希望Hotspot能够在这里应用很多优化。然后,与match声明相比,函数的apply方法将会有一个额外的方法调度。再次,这是一个固定的(和普通的)模式,我期望它可以被优化很多。


基本上,任何开销都可以忽略不计。就所有的优化而言,以人为简洁/不自然的方式编写代码为时尚早,直到您发现它是性能瓶颈为止。

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

与此同时,放松和享受一流的功能给你的“好”!

+0

感谢您的详细解答。我很高兴我可以使用第一个选项,然后:) – Arg