Прежде всего, я хотел бы прояснить, что это не вопрос «язык против языка», чтобы определить, что лучше.
Я давно использую Java и намерен продолжать его использовать. Параллельно с этим я в настоящее время изучаю Scala с большим интересом: кроме незначительных вещей, которые требуют некоторого привыкания, у меня сложилось впечатление, что я действительно могу очень хорошо работать на этом языке.
Мой вопрос: как программное обеспечение, написанное на Scala, сравнивается с программным обеспечением, написанным на Java, с точки зрения скорости выполнения и потребления памяти? Конечно, на этот вопрос в целом сложно ответить, но я ожидаю, что конструкции более высокого уровня, такие как сопоставление с образцом, функции высшего порядка и т. Д., Вносят некоторые накладные расходы.
Тем не менее, мой текущий опыт работы с Scala ограничен небольшими примерами под 50 строками кода, и я до сих пор не выполнил никаких тестов. Итак, у меня нет реальных данных.
Если оказалось, что в Scala есть некоторые накладные расходы по сравнению с Java, имеет ли смысл смешивать проекты Scala / Java, где можно кодировать более сложные части в Scala и критические по производительности части в Java? Это обычная практика?
РЕДАКТИРОВАТЬ 1
Я выполнил небольшой тест: построил список целых чисел, умножил каждое целое число на два и поместил его в новый список, распечатал полученный список. Я написал реализацию Java (Java 6) и реализацию Scala (Scala 2.9). Я запустил оба на Eclipse Indigo под Ubuntu 10.04.
Результаты сопоставимы: 480 мс для Java и 493 мс для Scala (в среднем за 100 итераций). Вот фрагменты, которые я использовал.
// Java
public static void main(String[] args)
{
long total = 0;
final int maxCount = 100;
for (int count = 0; count < maxCount; count++)
{
final long t1 = System.currentTimeMillis();
final int max = 20000;
final List<Integer> list = new ArrayList<Integer>();
for (int index = 1; index <= max; index++)
{
list.add(index);
}
final List<Integer> doub = new ArrayList<Integer>();
for (Integer value : list)
{
doub.add(value * 2);
}
for (Integer value : doub)
{
System.out.println(value);
}
final long t2 = System.currentTimeMillis();
System.out.println("Elapsed milliseconds: " + (t2 - t1));
total += t2 - t1;
}
System.out.println("Average milliseconds: " + (total / maxCount));
}
// Scala
def main(args: Array[String])
{
var total: Long = 0
val maxCount = 100
for (i <- 1 to maxCount)
{
val t1 = System.currentTimeMillis()
val list = (1 to 20000) toList
val doub = list map { n: Int => 2 * n }
doub foreach ( println )
val t2 = System.currentTimeMillis()
println("Elapsed milliseconds: " + (t2 - t1))
total = total + (t2 - t1)
}
println("Average milliseconds: " + (total / maxCount))
}
Таким образом, в этом случае кажется, что издержки Scala (с использованием range, map, lambda) действительно минимальны, что недалеко от информации, предоставленной World Engineer.
Может быть, есть другие конструкции Scala, которые следует использовать с осторожностью, потому что они особенно тяжелы для выполнения?
РЕДАКТИРОВАТЬ 2
Некоторые из вас отметили, что println во внутренних циклах занимают большую часть времени выполнения. Я удалил их и установил размер списков 100000 вместо 20000. В результате среднее значение составило 88 мс для Java и 49 мс для Scala.