2011-05-09 4 views
2

"원시"최적화 : 스칼라 나는 비슷한 선언을 보았다 여러 곳에서

스칼라 책에서 (프로그래밍 "스칼라 컴파일러는 자바 배열, 기본 형식 및 기본 연산 가능한 컴파일 된 코드를 사용"). 그러나 실제로 나는 다음과 같은 코드에서 예를 들어, 스칼라 유형이 더 (필자는 totalMemory와 freeMemory에서 방법을 사용하여 계산) 자바 유형과 메모리 사용이 표시되지 오전 : mem_used

long[] la = new Array[java.lang.Long](1024 * 1024); 
for(i <- 0 until la.length) 
    la(i) = new java.lang.Long(0); 

val La = new Array[Long](1024 * 1024); 
for(i <- 0 until La.length) 
    La(i) = 0l; 

을 (자바 긴) : >> 28.811M

mem_used (스칼라 긴) : >> 36.811M

나는 모든 유형의 추가 오버 헤드가 스칼라을 실현하지만, 어디 최적화는 무슨 일이 일어나고?

+1

메모리 사용량 측정 방법이 잘못되었습니다. 당신이 얻는 결과는 무의미합니다. –

+0

다른 언급 된 문제 외에도 Scala 프로그램이 Scala 라이브러리에서 추가 클래스를 가져올 가능성이 있습니다. – ziggystar

답변

9

무엇이 왜 컴파일되는지 알아 내려고 복잡한 회귀 방법으로 귀찮게합니까? 클래스에서 javap를 실행하면 정확히이 무엇인지 알 수 있습니다.

C:\>type La.scala 
class La { 
    val La = new Array[Long](1024 * 1024); 
} 

C:\>javap La 
Compiled from "La.scala" 
public class La extends java.lang.Object implements scala.ScalaObject{ 
    public long[] La(); 
    public La(); 
} 
2

Runtime.freeMemory의 설명에 따르면 반환되는 값은 마지막 gc가 완료된 시점에 따라 다릅니다. 따라서 오류가 측정하는 방식에 있습니다.

+0

죄송합니다, 나는 각 gc를 실행하고 있다고 언급 했어야합니다. 나는 모든 정리가 완료되었다는 보장은 아니지만이 사소한 경우에 그렇게되기를 바랍니다. – David

+0

약 8MB 만 할당 했으므로 가비지 수집기가 정리를 완료하는 데 필요하지 않을 수 있습니다. 측정 코드를 게시해야합니다. –

1

Java에서 메모리 사용량을 측정하는 것은 정말 어렵습니다. 그렇게하면 메모리 하위 시스템에 손을 대면 결과가 크게 달라 지므로 아무 것도하지 않더라도 자체 실행을 위해 JVM이 객체를 만들지 못한다는 것을 확신 할 수 없습니다. 특히 for에 객체가 생성되지 않도록 배열을 채우기 위해 for 루프가 아닌 while 루프를 사용해야합니다. 그런 다음 배열을 만드는 메모리 할당이 가비지 수집을 트리거 할 수 있습니다. 가장 좋은 방법은 -verbose:gc으로 jvm을 실행하여 측정간에 가비지 콜렉션이 발생하지 않도록하는 것입니다 (예 :

println("Starting") 
// Measure free memory 
// Create some stuff 
// Measure free memory 
println("Ending") 

GC가 시작과 끝 사이에 오는 것을 확인하면 해당 실행을 무시하십시오.

관련 문제