В настоящее время я профилирую производительность приложения, написанного на Scala, и мне интересно, можно ли использовать функциональные конструкции. С одной стороны, я люблю функциональное программирование для своей элегантности и лаконичности, с другой стороны, я боюсь, что в результате получится. Я нашел один очень хороший пример.Производительность Scala с функциональными конструкциями
У меня есть строка с миллионом символов, и мне нужно суммировать каждую цифру. Типичный функциональный подход будет выглядеть так:
val sum = value.map(_.asDigit).sum.toString
Однако, этот красивый, лаконичный, функциональный подход занимает 0.98s (почти второй)
var sum = 0;
for(digit <- value)
sum += digit.asDigit
Этот императив подход с другой стороны принимает только 0,022 s (2.24% из вышеприведенного времени) - это примерно в 50 раз быстрее ...
Я уверен, проблема возникает из-за того, что Scala генерирует новый список в первом подходе, а затем снова итерации по этому списку, чтобы создать сумма.
Это просто плохая идея полагаться на функциональные конструкции? Я имею в виду, они прекрасны - я их люблю, но они в 50 раз медленнее ...
P.S. Я тоже попробовал что-то еще.
val sum = value.foldLeft(0)((sum, value) => sum + value.asDigit)
Этот функциональный подход, который является чуть менее кратким и, возможно, даже труднее, чем читать императивный подход, берет 0.085s. Труднее читать И еще в 4 раза медленнее ...
Ваше использование 'map' создает промежуточную строку, которая вам не нужна. Вы можете избежать этого, используя 'value.view.map (_. AsDigit) .sum'. – Lee