2016-11-29 5 views
3

다음 코드 : 다음과 같은 오류에스칼라 인라인 적용 취소 추출기

object Test { 
    @inline def unapply(i: Int): Option[String] = 
    i match { 
     case 1 => Some("Got 1") 
     case 2 => Some("Got 2") 
     case 3 => throw new Exception("Should not test 3") 
     case _ => None 
    } 
    def test(i: Int) = i match { 
    case Test(k) => k 
    case 4 => "Another 4" 
    case _ => "" 
    } 
} 
Test.test(3) 

결과 : 오류의 출처가 분명 있음을

... 
at Test$.unapply(<console>:13) 
at Test$.test(<console>:17) 
... 

참고. 그러나이 오류는 메서드 unapply이 원하는만큼 인라인되어 있지 않음을 보여줍니다.
이 적용되지 않는 방법을 어떻게 인라인 할 수 있습니까? 이것은 성능상의 이유로 코드 재사용을위한 것입니다.

+0

잘 모르겠지만 스칼라가 메서드가 인라인되어 있어도 원래 스택 추적을 유지할 수 있습니까? – marstran

+0

성능 향상 수준은 어느 정도입니까? – Pavel

+1

@marstran 해체를 확인했는데 그 방법이 인라인되지 않았 음을 확인할 수 있습니다. 실제로 JVM에서는 인라인 함수에 디버그 코드를 생성 할 수 있습니다. –

답변

3

@inline요청 컴파일러가 메소드를 인라인하려고 노력하지만, 그것을하지 않으며, 경우에 따라서는 할 수없는 것을. 나는 컴파일러에 의해 인라인 될 수있는 것과 컴파일 될 수없는 것에 대한 스펙이 있다고는 생각하지 않는다. (컴파일러가 있다면 거기에있는 것을보고 싶지만) 컴파일러는이 경우에는 안된다. 당신이하는 일에 상관 없습니다.

일반적으로 일정하거나 작은 것으로 변경 될 가능성이없는 것을 인라인하려는 것입니다. 그렇지 않으면 Test.unapply을 많이 사용하면 컴파일 된 코드의 크기가 빠르게 커지고 인라인 된 메서드의 변경 사항이 해당 코드를 참조하는 모든 요소에 걸쳐 확산됩니다.

This answer @RexKerr에서 충분합니다.