study record

[Swift Concurrency] Optimize with Instruments 본문

Swift/Concurrency

[Swift Concurrency] Optimize with Instruments

asong 2025. 4. 28. 21:47

Swift Concurrency Instruments 사용하는 법

1. Xcode > Open Developer Tool > Instruments > Swift Concurrency

2. Command + i (컴파일, 빌드, Instruments 켜기까지 한 번에 해줌)

 

 

 

Swift Tasks

  • Running Tasks : 동시에 실행 중인 작업 수
  • Alive Tasks : 특정 시점에 얼마나 많은 작업이 있는지 
  • Total Tasks : 해당 시점까지 생성된 작업의 총 개수

 

 

 

Task Forests

Structured Concurrency 작업 간의 상하위 관계 그래픽으로 표현

 

 

 

 

Summary > Task State

다양한 상태에서 각 테스크에 소요된 시간을 보여주는 것

 

 

 

 

선택한 작업에 대한 모든 정보가 포함된 트랙을 타임라인에 고정할 수 있음

 

 

 

Problem

Running Tasks > 모든 작업이 강제 직렬화되어 하나씩만 수행중 (UI block 현상)

 

 

 

 

Narrative > 메인 스레드에서 오래 실행 확인

 

 

 

 

메인 스레드 Pin > Narrative > Source Viewer

 

 

 

문제가 된 코드 위치 확인

 

 

 

현재 이런 구조.

@MainActor 때문에 파일 압축 코드도 메인 스레드에서 실행되고 있었음.

 

이를 압축 코드는 따로 새로운 actor를 생성하여 분리한다.

 

 

 

 

최적화가 완성되었을까?!

 

 

 

 

단순 액터 분리로는 액터는 serial하게 코드를 동작시키므로 직렬로 테스크들이 진행된다.

병렬처리되지 않아 최적화라고 하기엔 아쉬움이 있다.

메인 액터와는 분리하였으므로 UI 블락 문제는 어느정도 해소되었을 것이다.

 

 

 

 

그렇다면 정말로 액터 접근이 필요한 부분만 따로 분리를 해서 최적화를 하는 방법이 있다!!

 

 

 

그렇다면 이렇게 ParallelCompressor Actor에서 분리를 어떻게 할 수 있을까??

 

 

정답은

 

@nonisolated

Swift 동시성 모델은 actor 내부 상태를 보호하기 위해 격리(isolation) 적용

기본적으로 actor의 모든 메서드와 프로퍼티는 actor context에서만 접근 가능

@nonisolated을 사용하면:

  • 해당 멤버가 actor 격리를 우회하고, actor 외부에서도 동기적으로 호출 가능
  • 내부 상태에 접근할 수 없음 (그래서 안전함)

메소드에 nonisolated를 붙이면 액터의 context에 속하지 않게 되고 직렬 처리를 피할 수 있게 된다.

단, log함수는 actor에 속하는 메소드이므로 다음과 같이 에러가 뜨게 된다.

 

이 문제는 메소드를 async로 바꾸고 log앞에 await을 붙이며 해결할 수 있다.

 

 

 

다시 Instruments를 찍어보면,

actor의 각 작업이 단기간만 잘 실행되는 것을 볼 수 있고,

actor의 Queue도 limit을 넘지 않게 유지하며 실행되는 것을 볼 수 있다.

 

최적화 완성!!

 

 

정리

  1. Instruments를 통해 UI 정지의 원인 분석 
  2. 동시성 코드 재구성하여 병렬 처리 능력 향상
  3. 데이터 사용하여 성능 개선 확인

 

 

 

참고

https://developer.apple.com/videos/play/wwdc2022/110350/

 

Visualize and optimize Swift concurrency - WWDC22 - Videos - Apple Developer

Learn how you can optimize your app with the Swift Concurrency template in Instruments. We'll discuss common performance issues and show...

developer.apple.com

https://developer.apple.com/tutorials/instruments

https://developer.apple.com/kr/videos/play/wwdc2024/10169/