2011-01-04 1 views
38

필자는 인라인 함수의 기본 원리를 이해하고 있다고 생각합니다. 스택에 매개 변수가 배치되고 호출 작업이 발생하는 함수 호출 대신 컴파일시 함수의 정의가 호출 된 곳으로 복사되어 런타임시 호출 오버 헤드.Scala의 @inline 주석은 언제 사용해야합니까?

  • 이 scalac 사용 현명함이 주석에서 힌트없이 일부 기능 (예를 들어, 개인 DEF)를 인라인 않습니다

    그래서 나는 알고 싶어?

  • 스케일 렉이 함수를 인라인한다고 암시하는 것이 좋은 시점을 어떻게 판단 할 수 있습니까?

  • 누구나 함수 또는 인라인되어야 할 함수의 예를 공유 할 수 있습니까?

+5

이 도움이 될 수 있습니다 : http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance – Arjan

답변

32

는 구현이 @inline 아무것도 합리적으로 변경할 수와 라이브러리공공 일부가 될 것입니다 어떤 마십시오.

"구현 변경"이라고 할 때 논리가 실제로 변경 될 수 있습니다. 예 :

object TradeComparator extends java.lang.Comparator[Trade] { 
    @inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time 
} 

"자연 비교"가 원자 카운터를 기반으로 변경되었다고 가정 해 봅시다. 응용 프로그램은 서로 다른 버전의 비교 코드에 대해 빌드되고 인라인 된 두 개의 구성 요소로 끝납니다. 개인적으로

+11

이것은 사용하지 않을 때 매우 유용합니다. 당신이 그것을 사용해야 할 때 몇 가지 길드 라인이 있습니까? 공개 API 함수를 제외한 모든 곳에 배치해야합니까? 아니면 scalac + JVM을 사용하면 어디서나 배치 할 필요가 없습니다. –

+1

@inline을 피할 때 이것을 좋은 대답으로 받아들입니다. 이 질문은 아마 전혀 사용하지 않는 이유를 설명합니다 : http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance –

0

, 나는 별명 @inline를 사용 : 나는 아무것도하지 알고 할 수있는 방법을 찾을 수 없습니다, 지금

class A(param: Param){ 
    @inline def a = param.a 
    def a2() = a * a 
} 

(I는 생성 된 .class를 JAD하려고했으나 결론을 내릴 수 없었다 아무것도).

제 목표는 컴파일러에서 원하는 것을 명시하는 것입니다. 그러나 무엇이 최선인지 결정하거나 간단하게 능력을 발휘하도록하십시오. 그것을하지 않으면 어쩌면 나중에 컴파일러 버전 것입니다.