2011-08-19 10 views
6

Antes que nada, no dude en corregir el título de mi pregunta, no estoy muy familiarizado con la jerga de programación funcional.Scala - sobrecarga de invocación de 'funciones de primera clase'

Mi pregunta es, ¿hay alguna sobrecarga (y qué tan significativa es) de tratar las funciones como 'contenido de variables'. Por ejemplo, en el código siguiente:

class Processor { 
    val map = Map[Class[_],AnyRef => Something](...) 

    def process(c:AnyRef):Something = map(c.getClass)(c) 
    def worksFor:List[Class[_]] = map.map(_._1) 
} 

es muy agradable, en comparación con:

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

    def process(c: AnyRef) = { 
    c match { 
     case c: Bears .... 
     . 
     . 
     . 
    } 
    } 
} 

pero va a realizar peor? (Obviamente se necesitará más memoria, debido al mapa)

¡Gracias por cualquier tipo de respuesta!

Respuesta

11

Cuando asigna una función como un valor, el objeto creado es una instancia de una de las clases de Función (Function1 si toma un único argumento, Function2 si toma dos argumentos, etc.). En realidad, invocar la función es solo cuestión de llamar al método apply en el objeto FunctionN.

En ese sentido, hay muy poca sobrecarga a menos que esté viendo un ciclo crítico. Teóricamente, se crea un objeto para representar la función, uno sin estado interno y de una clase muy pequeña (que contiene, más o menos, solo el código para implementar su función). Debido a la forma limitada en que se usa este objeto, espero que Hotspot pueda aplicar muchas optimizaciones aquí. Luego habrá un envío de método adicional al método de la función apply, en comparación con la declaración match. De nuevo, este es un patrón fijo (y común) tal que espero que pueda optimizarse bastante.


Esencialmente, cualquier sobrecarga será despreciable. Al igual que con todas las optimizaciones, sería prematuro escribir su código de forma artificialmente concisa/menos natural hasta que haya identificado que se trata de un cuello de botella de rendimiento.

Y si el rendimiento realmente era un problema crítico aquí, es probable que termine buscando algo mucho más optimizado que opción.

Mientras tanto, ¡relájese y disfrute de la "amabilidad" que le brindan las funciones de primera clase!

+0

Gracias por una respuesta detallada. Me alegra que pueda usar la primera opción, entonces :) – Arg

Cuestiones relacionadas