Я сравниваю производительность двух реализаций atoi. Первая - это итерация входной строки с получением символов с использованием charAt
; вторая - использование foldLeft
.
object Atoi {
def withRandomAccess(str: String, baze: Int): Int = {
def process(acc: Int, place: Int, str: String, index: Int): Int =
if (index >= 0) process(acc + value(str.charAt(index)) * place, place * baze, str, index-1) else acc
process(0, 1, str, str.length - 1)
}
def withFoldLeft(str: String, base: Int): Int = (0/:str) (_ * base + value(_))
def value(c: Char): Int = { /* omitted for clarity */ }
def symbol(i: Int): Char = { /* omitted for clarity */ }
}
Версия foldLeft
от 2 до 4 раз медленнее (полный код теста здесь ). Я этого не ожидал. Вы знаете, почему? Преобразование Scala строку в список List
перед ее обработкой? У вас есть подсказка, как повысить производительность foldLeft
для строк?