우선, 이것이 어느 것이 더 좋은지를 결정하기위한 language-X-versus-language-Y 질문이 아님을 분명히하고 싶습니다.
오랫동안 Java를 사용하고 있으며 계속 사용하려고합니다. 이와 병행하여, 나는 현재 스칼라에 큰 관심을 가지고 배우고 있습니다.
내 질문은 : Scala로 작성된 소프트웨어는 실행 속도 및 메모리 소비 측면에서 Java로 작성된 소프트웨어와 어떻게 비교됩니까? 물론 이것은 일반적으로 대답하기 어려운 질문이지만 패턴 일치, 고차 함수 등과 같은 높은 수준의 구성에는 약간의 오버 헤드가 발생할 것으로 기대합니다.
그러나 현재 Scala에서의 경험은 50 줄의 코드로 작은 예제로 제한되어 있으며 지금까지 벤치 마크를 실행하지 않았습니다. 따라서 실제 데이터가 없습니다.
스칼라 가 자바에 약간의 오버 헤드 가있는 것으로 밝혀지면 스칼라 에서 더 복잡한 부분과 자바에서 성능이 중요한 부분을 코딩하는 스칼라 / 자바 프로젝트를 혼합하는 것이 합리적입니까? 이것이 일반적인 관행입니까?
편집 1
작은 벤치 마크를 실행했습니다 : 정수 목록을 작성하고 각 정수에 2를 곱한 다음 새 목록에 넣고 결과 목록을 인쇄하십시오. Java 구현 (Java 6)과 Scala 구현 (Scala 2.9)을 작성했습니다. 우분투 10.04에서 Eclipse Indigo에서 모두 실행했습니다.
결과는 Java의 경우 480ms, 스칼라의 경우 493ms (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))
}
따라서이 경우 스칼라 오버 헤드 (범위,지도, 람다 사용)가 실제로 최소화되어 월드 엔지니어가 제공 한 정보와 멀지 않은 것으로 보입니다.
어쩌면 실행하기에 특히 무겁기 때문에주의해서 사용해야하는 다른 스칼라 구문이 있습니까?
편집 2
여러분 중 일부는 내부 루프의 println이 실행 시간의 대부분을 차지한다고 지적했습니다. 이를 제거하고 목록 크기를 20000 대신 100000으로 설정했습니다. 결과 평균은 Java의 경우 88ms, 스칼라의 경우 49ms입니다.