Coroutines 여러 개로 연산 속도 높이기

2024. 11. 22. 23:20·Language/Kotlin
728x90
반응형

이번 글에서는 전에 다루었던 withContext로 스레드를 전환 후 연산 작업을 더 빠르게 수행해보려고 한다.

 

기존에는 팩토리얼 계산을 Default Dispatcher를 사용해 하나의 코루틴에서 연산을 수행했다.

이번에는 여러 개의 코루틴에서 연산을 수행한다.

 

어떤 구조로 실행할까

  1. 팩토리얼을 몇개의 코루틴으로 나눠 실행할지 정해야 한다.
  2. 실행할 코루틴 갯수만큼 연산할 숫자의 길이를 동등하게 분배한다.
  3. 작은 범위를 계산하는 서브 코루틴을 동시에 실행시킨다.
  4. 모든 서브 코루틴이 종료되는 것을 기다린다.
  5. 모든 서브 코루틴이 종료되면 fold 함수를 사용해 작은 범위들을 모두 곱한다.

 

코드

suspend fun calculateFactorial(
        factorialOf: Int,
        numberOfCoroutines: Int
    ): BigInteger {
        return withContext(defaultDispatcher) {
            val subRanges = createSubRangeList(factorialOf, numberOfCoroutines)
            subRanges.map { subRange ->
                async {
                    calculateFactorialOfSubRange(subRange)
                }
            }.awaitAll()
                .fold(BigInteger.ONE, { acc, element ->
                    acc.multiply(element)
                })
        }
    }

fold 함수는 여기서 처음 보게 되었는데 값을 누적시키는 기능을 한다.

 

Kotlin.collections 패키지에 속해 있고 리턴 타입은 첫 파라미터로 지정한 초기값과 같다.

 

따라서, 여러 서브 코루틴이 종료된 후 fold 함수를 통해 각 서브 코루틴의 결과를 곱해 리턴한 것이다.

 

여기서 SubRange를 만드는 과정이나 각 SubRange의 팩토리얼 계산은

이번 글에서 중요한 요소가 아니므로 제외했다.

728x90
반응형
저작자표시 비영리 변경금지

'Language > Kotlin' 카테고리의 다른 글

GlobalScope 알아보기  (0) 2025.02.17
Structured Concurrency in Coroutines  (1) 2025.01.19
Java, Kotlin Interoperability 해결하기  (0) 2024.11.18
CoroutineScope와 CoroutineContext 되짚어보기  (0) 2024.09.21
withContext로 스레드 전환하기  (0) 2024.09.18
'Language/Kotlin' 카테고리의 다른 글
  • GlobalScope 알아보기
  • Structured Concurrency in Coroutines
  • Java, Kotlin Interoperability 해결하기
  • CoroutineScope와 CoroutineContext 되짚어보기
BonusTrack02.dev
BonusTrack02.dev
공부, 일상
  • BonusTrack02.dev
    BonusTrack02.dev
    BonusTrack02.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (237) N
      • Android (84)
      • Language (63) N
        • Java (19)
        • Kotlin (27) N
        • Swift (17)
      • 프로그래머스 (68)
      • 주저리주저리 (22)
        • 카페 (5)
        • 음식점 (4)
        • 컨퍼런스 (1)
        • 팝업스토어 (4)
        • 해외여행 (0)
        • 전시회 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    안드로이드
    databinding
    daterangepicker
    오블완
    ios
    MVVM
    SWIFT
    getNumericValue
    코틀린
    viewModelScope
    room
    LiveData
    코루틴
    CodeLab
    programmers
    android
    jetpack
    aac
    ViewModel
    Java
    스위프트
    Kotlin
    티스토리챌린지
    Material
    프로그래머스
    자바
    Observer
    coroutines
    배열
    PCCE
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BonusTrack02.dev
Coroutines 여러 개로 연산 속도 높이기
상단으로

티스토리툴바