[Compose] ComposeFeatureFlag 관련 정리

이지훈·2024년 10월 25일
0
post-thumbnail

서두

진행 중인 프로젝트의 개발을 이어가던 중, build-logic 내 configureCompoe 함수 내에서 다음과 같이 deprecated 되어있는 것을 발견하였다.(StrongSkippingMode 나온지가 얼마나 되었다고...)

확인해보니 Compose Compiler (kotlin 버전과 동일) 2.0.20 버전에 새로 나온 ComposeFeatureFlag 를 통해 StrongSkippingMode 활성화 여부를 설정하는 방식으로 바뀌었나 보다.

그래서 오늘은 이 Compose Compiler FeatureFlags 에 대해 알아보고자 한다.

본론

우선 코드는 다음과 같이 수정해주면 된다.

configure<ComposeCompilerGradlePluginExtension> {
    // Before
    // enableStrongSkippingMode.set(true)
    includeSourceInformation.set(true)

    // after or default 값이 enable 이기 때문에 생략 
    featureFlags.add(
        ComposeFeatureFlag.StrongSkipping,
    )

    metricsDestination.file("build/composeMetrics")
    reportsDestination.file("build/composeReports")

    stabilityConfigurationFile.set(project.rootDir.resolve("stability.config.conf"))
}

다음으로 featureFlags 에 추가할 수 있는 옵션들에 대해 알아보도록 하겠다.

composeCompiler {
   /**
    * Enable or disable strong skipping.
    *
    * Strong Skipping is a mode that improves the runtime performance of your application by skipping unnecessary
    * invocations of composable functions for which the parameters have not changed. In particular, when enabled, Composable functions
    * with unstable parameters become skippable and lambdas with unstable captures will be memoized.
    *
    * For more information, see this link:
    *  - [Strong skipping](https://https://github.com/JetBrains/kotlin/blob/master/plugins/compose/design/strong-skipping.md)
    *
    * This feature is enabled by default.
    *
    * To disable,
    */
    featureFlags.add(
        ComposeFeatureFlag.StrongSkipping.disabled()
    )

   /**
    * Enable or disable the intrinsic remember performance optimization.
    *
    * Intrinsic Remember is an optimization mode which improves the runtime performance of your application by inlining `remember`
    * invocations and replacing `.equals` comparison (for keys) with comparisons of the `$changed` meta parameter when possible. This
    * results in fewer slots being used and fewer comparisons being done at runtime.
    *
    * This feature is enabled by default.
    *
    * To disable,
    */
    featureFlags.add(
        ComposeFeatureFlag.IntrinsicRemember.disabled()
    )

    /**
    * Enable or disable groups around non-skipping composable functions.
    *
    * Removing groups around non-skipping composable function is an experimental mode which improves the runtime performance of your
    * application by skipping unnecessary groups around composable functions which do not skip (and thus do not require a group). This
    * optimization will remove the groups around functions that are not skippable such as explicitly marked as
    * `@NonSkippableComposable` and functions that are implicitly not skippable such inline functions and functions that return a
    * non-Unit value such as remember.
    *
    * This feature is still considered experimental and is thus disabled by default.
    *
    * To enable,
    */
    featureFlags.add(
        ComposeFeatureFlag.OptimiseNonSkippingGroups
    )
}

StrongSkipping

  • 파라미터가 변경되지 않은 경우 Composable 함수 호출을 스킵
  • 불안정한(unstable) 파라미터를 가진 함수도 스킵 가능(skippable)
  • 불안정한 캡처를 가진 람다를 메모이제이션(이후 Recomposition 이 발생하면, 동일한 람다를 재사용, 새로운 람다 인스턴스를 생성하지 않아, 그 비용을 줄임 -> 성능 향상)
  • default 값 활성화(enabled)

IntrinsicRemember

  • remember 호출을 인라인화
  • 키들의 .equals 비교를 $changed 메타 파라미터 비교로 대체
    -> 결과: 적은 슬롯 사용, 적은 비교 연산(런타임 성능 최적화)
  • default 값 활성화(enabled)

OptimiseNonSkippingGroups

  • 스킵이 불가능한 Composable 함수 주변의 불필요한 그룹을 제거
  • @NonSkippableComposable 또는 inline 함수, Unit을 반환하지 않는 컴포저블 함수 등에 적용
  • default 값 비활성화(disabled), 실험적 기능이기 때문

inline 함수는 skippable 하지 않으며, Row, Column, Box 등이 inline 함수이다.

참고로 위에 선언한 includeSourceInformation.set(true) 옵션은 Compose 컴파일러가 생성하는 코드에 소스 정보(위치, 라인 등)를 포함할지 여부를 결정하는 옵션이다.
기본값은 false 이며, release 빌드에서는 R8/Proguard가 이 정보를 안전하게 제거할 수 있다.

String Skipping Mode 의외에도 IntrinsicRemember, OptimisticNonSkippingGroups 옵션 모두, Compose 의 성능 최적화를 위해 Compose Compiler 가 제공하는 기능이다.

주석을 통해 유추해보았을 땐, 모두 활성화(true) 하는 것이 최적화에 도움이 될 것 같으나,
아직 실험적 기능이며, 이를 활성화 했을 때, 어떠한 Side Effect 가 있는지 파악이 되지 않아, 조금 더 학습 후 이를 적용하여, 적용 전과 후를 비교해보도록 해야겠다. 선발대들 부탁드립니다

레퍼런스)
https://youtrack.jetbrains.com/issue/KT-69414/Compose-featureFlags-override-values-of-the-deprecated-compose-options

https://github.com/doveletter/dove-letter/blob/main/2024/2024-09-09.md#5-compose-compiler-featureflags

https://elssiany.medium.com/compose-compiler-featureflags-e27f96ca235b

profile
실력은 고통의 총합이다. Android Developer
post-custom-banner

0개의 댓글