Почему foldLeft в Scala имеет более низкую производительность, чем итерация с индексом для строк?

Я сравниваю производительность двух реализаций 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 для строк?

9
задан skaffman 27 November 2011 в 15:22
поделиться