2013-09-23 2 views
3

여기 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 및 비율의 수가 더 악화 될 것으로 보인다 반복이 증가합니다.

은 특별한 이유 javacfor (int i = L; i < H; i += 1)에 대해 생성하는 어떤 바이트 코드 형태로 하지 최적화 for (i <- L to/until H)scalac이 선택하는 있습니까? 스칼라가 물건을 단순하게 유지하고 개발자가 루프 루핑 속도가 필요할 때 while 루프와 같은보다 성능이 좋은 양식에 의지 할 것을 기대하기 때문에 그것이 가능할 수 있습니까? 그렇다면 왜 그처럼 단순한 루프의 빈도가 주어지면 좋을까요?

+0

그렇게 쉽지 않으므로. 컴파일러는 전달하는 객체에서'foreach' 구현이 어떻게 보이는지 알아야합니다. 그런 최적화에서 잘못 될 수있는 많은 것들이 있습니다. – drexin

+0

확실하게, ' to/'이라는 특수한 경우에는 충분한 정보가 컴파일시에 정적으로 제공 될 수 있습니다. –

+1

[Spire] (https://github.com/non/spire)의'cfor' 및 ['cforRange'] (https://github.com/non/spire/commit/6dc6559e7e0814f54745a7427fd5fe216076af10)를 확인하십시오. 정확하게 매크로를 통한 이러한 종류의 최적화. –

답변

3

스칼라에서 for-comprehensions 성능은 현재 매우 오랜 논쟁 거리입니다.

은 다음 링크를 참조하십시오 :

TL, DR : 스칼라 팀은 어떤 특별한을 선호 할 것이다 것보다 더 일반적인 최적화에 집중하기로 결정 클래스 및 가장자리 - 경우 (이 경우 : Range).

+0

더 일반적인 최적화가 어떻게 든 Range 구문을 일반적으로 어떻게 다루는가? 이론적으로도? –

+0

@ErikAllik : ['foreach' 방법에 대한 ['@inline' annotation] (http://www.scala-lang.org/api/current/#scala.inline) (https://github.com/scala /scala/blob/v2.10.2/src/library/scala/collection/immutable/Range.scala#L135). – senia

관련 문제