introduccion - programando en scala
¿Cuándo debería(y no debería) usar la anotación @inline de Scala? (2)
Creo que entiendo los conceptos básicos de las funciones en línea: en lugar de una llamada a función que coloca los 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 compilación, guardando la sobrecarga de invocación en tiempo de ejecución.
Entonces quiero saber:
¿Scalac usa inteligencia para alinear algunas funciones (por ejemplo, def privado) sin las sugerencias de las anotaciones?
¿Cómo puedo juzgar cuándo es una buena idea insinuar escalar que incluye una función?
¿Alguien puede compartir ejemplos de funciones o invocaciones que deberían o no estar incluidas?
Personalmente, uso @inline para alias:
class A(param: Param){
@inline def a = param.a
def a2() = a * a
}
Ahora, no pude encontrar una forma de saber si hace algo (traté de crear la clase generada, pero no pude concluir nada).
Mi objetivo es explicar 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.
Nunca @inline
nada cuya implementación pueda cambiar razonablemente y que será una parte pública de una biblioteca .
Cuando digo "cambio de implementación" quiero decir que la lógica en realidad 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.