En Scala, l'utilisation de conversions de types implicites pour augmenter la fonctionnalité d'une classe a-t-elle un impact significatif sur le processeur ou la mémoire par rapport à d'autres choix d'implémentation possibles ?
Prenons l'exemple d'une fonction idiote de manipulation des chaînes de caractères. Cette implémentation utilise la concaténation de chaînes de caractères :
object Funky {
def main(args: Array[String]) {
args foreach(arg => println("Funky " + arg))
}
}
Cette implémentation cache la concaténation derrière une méthode membre en utilisant une conversion de type implicite :
class FunkyString(str: String) {
def funkify() = "Funky " + str
}
object ImplicitFunky {
implicit def asFunkyString(str: String) = new FunkyString(str)
def main(args: Array[String]) {
args foreach(arg => println(arg.funkify()))
}
}
Les deux font la même chose :
scala> Funky.main(Array("Cold Medina", "Town", "Drummer"))
Funky Cold Medina
Funky Town
Funky Drummer
scala> ImplicitFunky.main(Array("Cold Medina", "Town", "Drummer"))
Funky Cold Medina
Funky Town
Funky Drummer
Y a-t-il une différence de performance ? Quelques considérations spécifiques :
Scala met-il en ligne les appels implicites à la méthode asFunkyString ?
Scala crée-t-il réellement un nouvel objet wrapper FunkyString pour chaque arg, ou peut-il optimiser les allocations d'objets supplémentaires ?
Supposons que FunkyString possède 3 méthodes différentes (funkify1, funkify2, et funkify3), et que le corps de foreach appelle chacune d'entre elles successivement :
println(arg.funkify1())
println(arg.funkify2())
println(arg.funkify3())
Scala répéterait-il la conversion 3 fois, ou optimiserait-il les conversions redondantes et ne la ferait-il qu'une fois pour chaque itération de la boucle ?
Supposons plutôt que je capture explicitement la conversion dans une autre variable, comme ceci :
val fs = asFunkyString(arg)
println(fs.funkify1())
println(fs.funkify2())
println(fs.funkify3())
Cela change-t-il la situation ?
En termes pratiques, l'utilisation généralisée des conversions implicites peut-elle poser un problème de performance ou est-elle généralement inoffensive ?