В Scala существует ли значительное влияние процессора или памяти на использование неявных преобразований типов для расширения функциональности класса по сравнению с другими возможными вариантами реализации?
Например, рассмотрим глупую функцию манипуляции строками. Эта реализация использует конкатенацию строк:
object Funky {
def main(args: Array[String]) {
args foreach(arg => println("Funky " + arg))
}
}
Эта реализация скрывает конкатенацию за метод-член, используя неявное преобразование типа:
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()))
}
}
Оба делают то же самое:
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
Есть ли разница в производительности? Несколько конкретных соображений:
Включает ли Scala неявные вызовы метода asFunkyString?
Создает ли Scala новый объект FunkyString для каждого аргумента или может оптимизировать выделение дополнительных объектов?
Предположим, что у FunkyString было 3 разных метода (funkify1, funkify2 и funkify3), а тело foreach вызывало каждый из них подряд:
println(arg.funkify1())
println(arg.funkify2())
println(arg.funkify3())
Будет ли Scala повторять преобразование 3 раза или будет оптимизировать избыточные преобразования и просто сделать это один раз для каждой итерации цикла?
Предположим, что я явно фиксирую преобразование в другой переменной, например:
val fs = asFunkyString(arg)
println(fs.funkify1())
println(fs.funkify2())
println(fs.funkify3())
Изменит ли это ситуацию?
В практическом плане широкое использование неявных преобразований является потенциальной проблемой производительности или обычно безвредно?