@inlinable 알아보기

권승용(Eric)·2024년 12월 6일

TIL

목록 보기
19/38

배경

  • @inlinable이 대충 컴파일 타임 최적화를 위한 어트리뷰트임은 알고 있었지만, 정확하게 무슨 일을 하는지 모르고 있다.
  • 이를 알기 위해 공식문서를 통해 학습하였다.

attribute?

  • inlinable을 다루기 전에 먼저 attribute가 무엇인지 정확히 짚고 넘어가자.
  • Swift에서 어트리뷰트는 선언과 타입에 추가적인 정보를 제공하는 방법이다.
  • 선언에 적용하는 어트리뷰트와 타입에 적용하는 어트리뷰트 두 가지 종류가 있다.
  • 어트리뷰트는 아래와 같이 작성할 수 있다.
@<#attribute name#>
@<#attribute name#>(<#attribute arguments#>)
  • 매크로와 프로퍼티 래퍼 또한 어트리뷰트 문법을 따른다.
  • 이제 @inlinable 어트리뷰트를 알아보자

inlinable

  • 함수, 메소드, 계산 프로퍼티, 서브스크립트, 편의 생성자, 소멸자 선언에 이 어트리뷰트를 적용해 선언의 구현을 모듈의 공용 인터페이스의 일부로 노출시킬 수 있다.
    • Swift에서는 컴파일 타임에 다른 모듈의 구현을 알 수 없다.
    • 따라서 컴파일 타임 최적화인 인라이닝을 다른 모듈에 대해서는 사용할 수 없음
    • 이 때 inlining 어트리뷰트를 적용하면, 모듈의 public 인터페이스에 대해 인라이닝 최적화가 가능해진다.
  • 컴파일러는 호출 지점에서 인라인 가능한 심볼에 대한 호출을 해당 심볼 구현의 복사본으로 대체할 수 있다.
    • 호출 비용 절감 가능!

인라이닝 최적화란?
함수의 호출을 함수의 구현부로 대체하여 함수 호출 비용을 없애는 컴파일 타임 최적화 기법!

  • inlinable 코드는 모듈에서 open 또는 public으로 선언된 심볼들과 상호작용 가능
  • 또한 같은 모듈 내 usableFromInline 어트리뷰트로 마크된 internal 심볼들과 상호작용 가능
  • private / fileprivate 심볼과는 상호작용할 수 없다.
    • inlinable로 선언된 코드는 다른 모듈의 open, public으로 선언된 심볼 또는 같은 모듈의 internal로 선언된 심볼만을 사용(호출, 참조)할 수 있다.
  • 중첩 함수 또는 fileprivate, private으로 선언된 선언에는 이 어트리뷰트를 적용할 수 없다.
  • inlinable 함수 내부에 정의된 함수와 클로저들은 inlinable 어트리뷰트로 마크될 수 없지만 암시적으로 inlinable하다.

정리

  • @inlinabe 어트리뷰트는 모듈 인터페이스가 다른 모듈에서도 인라이닝 최적화가 가능하도록 해주는 기능을 가진다.
  • 킹피셔, 알라모파이어, TCA 등 여러 서드파티 코드에서 많이 볼 수 있었던 이유가 있었다...

추가

  • 서로 다른 모듈이어도, 릴리즈 시점엔 모두 합쳐서 함께 컴파일하면 @inlinable 없이 공격적인 컴파일 타임 최적화가 가능한 것이 아닌가? 어차피 소스코드가 있으니 합칠 수 있지 않나? 라는 의문이 들었다.
  • 권영호 튜터님께서 그렇게 하면 네임스페이스의 분리가 없어져, 서로 다른 모듈의 이름이 같은 함수일 경우 어떤 함수를 호출해야 하는지 찾지 못하는 등 문제가 발생할 수 있어 독립적으로 컴파일한다고 알려주셨다.
  • 따라서 모듈의 인터페이스에는 inlining 조져주는게 좋음~~

inlining의 단점?

  • 그러면 모든 공용 인터페이스에 inlining 어트리뷰트를 적용하는 것이 좋을까?
  • inlining의 단점은 모듈 인터페이스에서 내부적으로 작동하는 방식에 대한 세부 정보가 유출되기 때문에 향후 버전의 라이브러리에서 구현을 안전하게 변경하기가 훨씬 더 까다로워진다는 것이다.
  • 조심해서 작성하기~~

출처

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes/

https://www.swift.org/blog/whole-module-optimizations/

https://forums.swift.org/t/inlinable-performance-example/65663/10

profile
ios 개발자에용

0개의 댓글