inlinable
@inlinable
이 무엇인가요?
@inlinable
속성은 Swift에서 비교적 다른 속성들에 비해 잘 알려지지 않은(?) 속성입니다.
@inlinable
은 애플리케이션 내 런타임에 있어서의 약간의 최적화를 통해 성능을 향상시키는 기능을 가지고 있어요.
이 속성이 어떻게 동작하는지 알아보도록 할게요!
@inlinable
속성의 가장 중요한 점은 코드 인라인과 관련이 있지만, @inline
속성과는 동일하지 않습니다.
프로그래밍에서 인라인 이란 테크닉을 통해 메서드 호출부를 메서드 바디 본문으로 대체하여 컴파일러 최적화를 수행합니다.
메서드 호출이라는 행위는 코드로 작성하기엔 매우 간단하죠!
하지만 이 프로세스가 동작하는데에는 메서드 호출을 위해 새로운 스택을 푸시하고 이를 추적하고 상태를 저장 및 변경등의 관리등이 수행되는 등 꽤나 복잡한 상호작용들이 발생하며 그 과정속에서 오버헤드를 유발할 수 있어요
스택 추적의 경우에는 디버깅이 용이하다는 장점이 있지만 예를 들어 호출하고자 하는 함수 본문이 너무나도 간단하거나 한 경우 굳이 매번 이 작업을 수행해야 할 지에 대한 의문이 있을수 있습니다.
예시를 살펴볼게요.
func printPlusOne(_ num: Int) {
print("Number: \(num + 1)")
}
print("number 출력!")
printPlusOne(5)
printPlusOne(6)
printPlusOne(7)
메서드 printPlusOne
은 매우 매우 간단한 동작을 수행하는 메서드입니다.
코드의 가독성, 코드 중복 제거 등 다양한 이유로 함수화 하여 호출할 수 있지만 실제 앱을 릴리즈 할 때에는 아래와 같이 구현하는 것이 성능상 더 나을 거에요
print("number 출력!")
printPlusOne("Number: \(5+1)")
printPlusOne("Number: \(6+1)")
printPlusOne("Number: \(7+1)")
앞서 살펴본 코드와 이 코드에 어떤 차이가 있나요?
호출하던 함수의 본문을 함수 호출 부분에 대체했어요.
이렇게 제거된 메서드 호출 오버헤드는 인라인된 메서드의 크기에 따라 전체 바이너리 크기를 약간 늘리는 대신 성능을 향상시킬 수 있어요.
인라인과 같은 대부분의 최적화 테크닉에 중요한 측면 중 하나는 대부분 내부적으로 처리가 된다는 것 입니다.
@inlinable
로 선언된 구현부는 모듈의 public interface에 포함이 되어 다른 모듈에서 호출시 오버헤드를 줄일 수 있어요.
@inlinable
한 메서드가 내부에서 다른 메서드를 호출하게 되면 컴파일러는 해당 메서드 또한 public interface에 노출을 요청합니다.
그렇기에 private, internal 접근 제한을 가지는 함수나 프로퍼티를 인라인 함수 내부에서 사용할 수가 없어요.
모든 메서드의 정보를 인터페이스에 포함시키면 프레임워크의 크기가 자연스레 커지게 되고 어쩌면 대부분이 낭비가 될 수도 있어요.
그렇기에 적재적소에 맞춰서 사용하는 것이 중요할 것 같습니다!
'iOS' 카테고리의 다른 글
[iOS] Swift Concurrency (0) | 2023.08.05 |
---|---|
[iOS] Compositional Layout 활용 예시 (0) | 2023.05.28 |
[iOS] Singleton 사용시 주의점과 의존성 주입 (0) | 2023.05.24 |
[iOS] Protocol Composition과 Default Implementation 활용하기 (0) | 2023.05.22 |
[iOS] RunLoop (0) | 2023.05.20 |