Я чувствую, что сообщество Scala имеет небольшую одержимость написанием "сжатого", "крутого", "scala идиоматического" , "однострочного" -использования возможного кода, За этим сразу следует сравнение с Java/обязательным/уродливым кодом.
Хотя это (иногда) приводит к легкому пониманию кода, это также приводит к неэффективному коду для 99% разработчиков. И здесь Java/С++ нелегко победить.
Рассмотрим эту простую задачу: Учитывая список целых чисел, удалите наибольший элемент. Заказ не нужно сохранять.
Вот моя версия решения (это может быть не самое большое, но это то, что сделал бы средний разработчик не-rockstar).
def removeMaxCool(xs: List[Int]) = {
val maxIndex = xs.indexOf(xs.max);
xs.take(maxIndex) ::: xs.drop(maxIndex+1)
}
Он Scala идиоматический, сжатый и использует несколько хороших функций списка. Это также очень неэффективно. Он перемещается по списку как минимум 3 или 4 раза.
Вот мое полностью непонятное, похожее на Java решение. Это также будет писать разумный разработчик Java (или Scala новичок).
def removeMaxFast(xs: List[Int]) = {
var res = ArrayBuffer[Int]()
var max = xs.head
var first = true;
for (x <- xs) {
if (first) {
first = false;
} else {
if (x > max) {
res.append(max)
max = x
} else {
res.append(x)
}
}
}
res.toList
}
Полностью не-w64 > идиоматический, нефункциональный, нечеткий, но очень эффективный. Он перемещает список только один раз!
Итак, если 99% разработчиков Java пишут более эффективный код, чем 99% разработчиков Scala, это огромный препятствие для перехода на более широкое принятие. Есть ли выход из этой ловушки?
Я ищу практические советы, чтобы избежать таких "ловушек неэффективности", сохраняя при этом краткое описание реализации.
Разъяснение: Этот вопрос исходит из сценария реальной жизни: мне пришлось написать сложный алгоритм. Сначала я написал его в Scala, затем мне пришлось "переписать его на Java. Реализация Java была вдвое длиннее, но не такая ясная, но в то же время она была в два раза быстрее. Перезапись кода Scala, который будет эффективен, вероятно, займет некоторое время и несколько более глубокое понимание внутренней эффективности Scala (для сопоставления с сеткой и сгибом и т.д.).