2012-02-25 17 views
5

En muchos casos con Scala, como las invocaciones de funciones de ámbito local simple, se puede imaginar que a menudo sería teóricamente posible deshacerse por completo del objeto de función. Pero AFAIK, la JVM no sabe cómo hacer esto, y tampoco creo que Scala lo haga. ¿Correcto?¿Alguna vez Scala (o JVM) ha optimizado objetos (Function)?

¿Los objetos anónimos están siempre sellados? Si no, hay un límite bastante duro sobre cuánto dinero se puede hacer. ¿Correcto?

¿Alguien está al tanto de los esfuerzos planificados que puedan abordar este tipo de optimizaciones?

Véase también la cuestión en Java puro relacionados: Does a modern JVM optimize simple inline anonymous class allocation?

(El canto de "no optimizar demasiado pronto", "no importa", y otros es muy redundante en este punto y no se útil.)

+1

¿Qué quiere decir con deshacerse de objetos funcionales? ¿Quiere decir que su código está en línea? ¿O después de que el código esté en línea, el objeto que contiene la función es basura recolectada? – Bill

+0

@Bill, disculpa por no ser claro. Quiero decir nunca crear el objeto en absoluto. En muchos casos, especialmente para funciones locales anónimas, es efectivamente sin estado y el método de aplicación es efectivamente estático. –

Respuesta

5

El análisis de escape en línea más puede hacer exactamente eso. Se puede demostrar esto a sí mismo si se utiliza la presentación de informes de compilación en JVM 7, o punto de referencia los siguientes dos fragmentos de código:

def rfor(i0: Int, i1: Int)(f: Int => Unit) { 
    var i = i0 
    while (i <= i1) { 
    f(i) 
    i += 1 
    } 
} 

def whiley = { 
    var s = 0 
    var n = 1 
    while (n <= 500000000) { 
    val k = n >> 2 
    var i = 1 
    while (i <= 2) { 
     s += i*k 
     i += 1 
    } 
    n += 1 
    } 
    s 
} 

def rfory = { 
    var s = 0 
    var n = 0 
    while (n <= 500000000) { 
    val k = n >> 2 
    rfor(1, 2){ s += k * _ } 
    n += 1 
    } 
    s 
} 

En mi máquina, el segundo es al menos tan rápido como el primero (a veces más rápido), a pesar de que el segundo parece requerir una creación de funciones cada dos iteraciones.

Cuestiones relacionadas