2011-01-04 9 views
38

Creo que entiendo los conceptos básicos de las funciones en línea: en lugar de una llamada a función que coloca parámetros en la pila y se produce una operación de invocación, la definición de la función se copia en el momento de la invocación, guardando la gastos generales de invocación en tiempo de ejecución.¿Cuándo debería (y no debería) usar la anotación @inline de Scala?

así que quiero saber:

  • ¿Tiene inteligencia scalac uso de algunas funciones en línea (por ejemplo def privado) sin los consejos de anotaciones?

  • ¿Cómo puedo juzgar cuándo es una buena idea insinuarle a scalac que incluye una función?

  • ¿Alguien puede compartir ejemplos de funciones o invocaciones que deberían o no deberían estar incluidas?

+5

esto podría ayudar: http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance – Arjan

Respuesta

32

Nunca @inline nada cuya aplicación podría razonablemente cambiar y que va a ser una parte públicade una biblioteca.

Cuando digo "cambio de implementación" me refiero a que la lógica realmente podría cambiar. Por ejemplo:

object TradeComparator extends java.lang.Comparator[Trade] { 
    @inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time 
} 

Digamos que la "comparación natural" cambió para basarse en un contador atómico. Es posible que descubra que una aplicación termina con 2 componentes, cada uno integrado y en línea contra versiones diferentes del código de comparación.

+11

Esta es una muy buena respuesta para cuando no usarlo. ¿Hay algunas guildlines en cuando DEBERÍAS usarlo? ¿Debo comenzar a colocarlo en todas partes, excepto en las funciones API públicas? ¿O es scalac + JVM lo suficientemente inteligente como para que casi no necesite colocarlo en ningún lado? –

+1

Aceptando esto como una buena respuesta para cuándo evitar @inline. Esta pregunta explica por qué probablemente no sea de mucha utilidad usar: http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance –

0

Personalmente, yo uso @inline de alias:

class A(param: Param){ 
    @inline def a = param.a 
    def a2() = a * a 
} 

Ahora, no pude encontrar una manera de saber si lo hace nada (Traté de jad los .class generados, pero no podía concluir cualquier cosa).

Mi objetivo es explicitar lo que quiero que haga el compilador. Pero deja que decida qué es lo mejor, o simplemente haz lo que sea capaz de hacer. Si no lo hace, tal vez la versión posterior del compilador lo haga.

Cuestiones relacionadas