Unity/Study

유니티 MethodImplOptions.AggressiveInlining란? #인라인화

VR하는소년 2024. 9. 23. 08:00

코드를 최적화하려면 여러 가지 기술을 사용해야 합니다. 그중 하나가 인라인화(inlining)입니다.

 

인라인화는 간단하게 말해, 메서드 호출을 제거하고 해당 메서드의 코드를 호출 위치에 직접 삽입하는 최적화 기법입니다. C#에는 인라인화를 강력히 권고하는 속성(Attribute)이 있는데, 바로 MethodImplOptions.AggressiveInlining입니다.

 

이번 포스팅에서는 MethodImplOptions.AggressiveInlining 속성에 대해 간단하게 알아보겠습니다.

 


MethodImplOptions.AggressiveInlining란?

AggressiveInlining은 C#의 MethodImplOptions 열거형(enum)의 값 중 하나입니다.

 

AggressiveInlining 속성을 메서드에 적용하면 컴파일러에게 해당 메서드를 인라인화하라적극적으로 요청하는 것이 됩니다. 인라인화는 컴파일러가 메서드 호출을 제거하고, 해당 메서드의 본문(코드)을 호출 위치에 직접 삽입하는 최적화 기법입니다.

 

다음과 같이 MethodImpl 특성(Attribute)을 사용하여 메서드에 적용할 수 있습니다.

using System.Runtime.CompilerServices;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float Sign(float value)
{
    return value >= 0.0f ? 1f : -1f;
}

 

Sign함수에 대해서는 아래 포스팅을 참고해주세요.

 

2024.09.17 - [Unity/Study] - 유니티 입력된 숫자의 부호를 반환하는 수학 함수 #Mathf.Sign

 

impl의 약자는? 🔽

더보기

MethodImpl에서 impl은 "implementation"의 약자입니다. 즉, MethodImpl은 "Method Implementation"을 줄인 표현으로, "메서드 구현"을 의미합니다.


인라인화는 왜 필요할까요?

인라인화의 주요 목적은 메서드 호출 오버헤드를 줄이는 것입니다. 메서드를 호출할 때는 호출을 위한 스택 프레임을 생성하고 인수를 전달하는 등 많은 작업이 필요합니다. 이러한 작업들은 단일 호출에서는 큰 문제가 아니지만, 반복적으로 호출되는 짧은 메서드에서는 성능 저하를 유발할 수 있습니다.

 

예를 들어, 다음과 같은 간단한 수학 연산 메서드는 여러 번 호출될 가능성이 큽니다.

public static float Add(float a, float b)
{
    return a + b;
}

이러한 단순한 메서드를 인라인화하면 호출에 필요한 오버헤드를 없앨 수 있어 성능을 향상시킬 수 있습니다.

 


AggressiveInlining의 주의점

MethodImplOptions.AggressiveInlining을 사용하면 컴파일러가 해당 메서드를 인라인화하도록 권고하지만, 실제로 반드시 인라인화가 이루어지는 것은 아닙니다. 이 속성은 요청일 뿐이며, 최종 결정은 컴파일러와 JIT(Just-In-Time) 컴파일러에 달려 있습니다.

 

예를 들어 위 예시 함수인 Add와 Sign 함수가 아닌 내부 로직이 복잡한 함수의 경우에는  AggressiveInlining을 사용해도 컴파일러는 다양한 요인(메서드 크기, 복잡도, 호출 위치 등)을 고려하여 인라인화를 하지 않을 수도 있습니다.


언제 AggressiveInlining을 사용해야 할까요?

AggressiveInlining은 짧고 자주 호출되는 메서드에 사용하기 좋습니다. 실시간 처리가 필요한 프로그램에서 반복적으로 호출되는 메서드에 적용하면 성능 향상에 도움을 줄 수 있습니다.