여기 scalac
쉽게 최적화 할 수있는 첫 인상에서 뭔가처럼 보이는, 코드 조각의 예 :scalac은 단순한 for 구조에서 오버 헤드를 최적화하지 않는 이유는 무엇입니까?
val t0 = System.nanoTime()
for (i <- 0 to 1000000000) {}
val t1 = System.nanoTime()
var i = 0
while (i < 1000000000) i += 1
val t2 = System.nanoTime()
println((t1 - t0).toDouble/(t2 - t1).toDouble)
위의 코드 인쇄 76.30068413477652
및 비율의 수가 더 악화 될 것으로 보인다 반복이 증가합니다.
javac
가
for (int i = L; i < H; i += 1)
에 대해 생성하는 어떤 바이트 코드 형태로
하지 최적화
for (i <- L to/until H)
에
scalac
이 선택하는 있습니까? 스칼라가 물건을 단순하게 유지하고 개발자가 루프 루핑 속도가 필요할 때
while
루프와 같은보다 성능이 좋은 양식에 의지 할 것을 기대하기 때문에 그것이 가능할 수 있습니까? 그렇다면 왜 그처럼 단순한 루프의 빈도가 주어지면 좋을까요?
그렇게 쉽지 않으므로. 컴파일러는 전달하는 객체에서'foreach' 구현이 어떻게 보이는지 알아야합니다. 그런 최적화에서 잘못 될 수있는 많은 것들이 있습니다. – drexin
확실하게, ' to/'이라는 특수한 경우에는 충분한 정보가 컴파일시에 정적으로 제공 될 수 있습니다. –
[Spire] (https://github.com/non/spire)의'cfor' 및 ['cforRange'] (https://github.com/non/spire/commit/6dc6559e7e0814f54745a7427fd5fe216076af10)를 확인하십시오. 정확하게 매크로를 통한 이러한 종류의 최적화. –