Fipe๋ Kotlin Flow๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ด๊ณ ์กฐ๋ฆฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฒฝ๋ Kotlin Multiplatform ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
์๊ณ ์ง์ค๋ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ์ฐ๊ฒฐํ์ฌ(์: ๋งคํ, ๋ฒํผ๋ง, ๋ณ๋ ฌ ๋ณํ) ๋ณต์กํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ์กฐ๋ฆฝ ๊ฐ๋ฅํ ํ์ดํ๋ผ์ธ: ์ฌ๋ฌ ๋ณํ ๋จ๊ณ๋ฅผ (
then) ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํฉ๋๋ค. - ์ ์ฐํ ๋จ๊ณ: ๋งคํ, ๋ฒํผ๋ง, ๊ณต์ , ์ํ ์ฒ๋ฆฌ, ๋ณ๋ ฌ ์์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ์ ๊ณตํ์ฌ ๋ค์ํ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ง์ํฉ๋๋ค.
- Kotlin Multiplatform ์ง์: JVM, Android, iOS ๋ฑ ๋ค์ํ ํ๋ซํผ์์ ์คํ ๊ฐ๋ฅํฉ๋๋ค.
- Coroutine ๋ฐ Flow ๊ธฐ๋ฐ: Coroutine ๋ฐ Flow๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
// ๊ฐ๋จํ ํ์ดํ๋ผ์ธ ์์
fun main() = runBlocking {
val bufferSize = 30
val doublingStep = MapStep<Int, Int> { delay(30); it * 2 }
val toDoubleStep = MapStep<Int, Double> { delay(60); it.toDouble() }
val incrementStep = MapStep<Double, Double> { it + 1 }
fun getPipeline(useBuffer: Boolean): Fipe<Int, Double> = fipe<Int>()
.then(doublingStep)
.let { if (useBuffer) it.thenBuffer(bufferSize) else it }
.then(toDoubleStep)
.let { if (useBuffer) it.thenBuffer(bufferSize) else it }
.then(incrementStep)
suspend fun Fipe<Int, Double>.pipelineResult(): List<Double> {
return Dispatchers.Default {
toFlow(
flow {
repeat(bufferSize) {
delay(30)
emit(it)
}
}
).take(bufferSize).toList()
}
}
val n = bufferSize
val t1 = 30L
val t2 = 60L
val t3 = 0L
val expectedSequential = ((t1 + t2 + t3) * n).milliseconds
val expectedPipeline = (t1 + (n - 1) * maxOf(t1, t2, t3)).milliseconds
val pipelineWithoutBuffer = getPipeline(false)
val pipelineWithBuffer = getPipeline(true)
val timeWithoutBuffer = measureTime { pipelineWithoutBuffer.pipelineResult() }
val timeWithBuffer = measureTime { pipelineWithBuffer.pipelineResult() }
println("์ด๋ก ์ ์ต์ ์๊ฐ (์์ฐจ ์ฒ๋ฆฌ): $expectedSequential")
println("์ด๋ก ์ ์ต์ ์๊ฐ (ํ์ดํ๋ผ์ธ ์ฒ๋ฆฌ): $expectedPipeline")
println("์ค์ ์์ฐจ ์ฒ๋ฆฌ ์๊ฐ: $timeWithoutBuffer")
println("์ค์ ํ์ดํ๋ผ์ธ ์ฒ๋ฆฌ ์๊ฐ: $timeWithBuffer")
}์ด๋ก ์ ์ต์ ์๊ฐ (์์ฐจ ์ฒ๋ฆฌ): 2.7s
์ด๋ก ์ ์ต์ ์๊ฐ (ํ์ดํ๋ผ์ธ ์ฒ๋ฆฌ): 1.77s
์ค์ ์์ฐจ ์ฒ๋ฆฌ ์๊ฐ: 3.958783583s
์ค์ ํ์ดํ๋ผ์ธ ์ฒ๋ฆฌ ์๊ฐ: 2.050898667s
ํ์ดํ๋ผ์ธ์ .then(...)์ ์ฌ์ฉํ์ฌ ๋จ๊ณ๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ ๊ตฌ์ฑ๋ฉ๋๋ค.
๊ฐ ๋จ๊ณ๋ ํ๋ฆ ๋ด์์ ์์๋ฅผ ๋ณํํ๊ฑฐ๋, ๋ฒํผ๋งํ๊ฑฐ๋, ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ ์์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๋ณ์ํํ๊ณ ์กฐ๋ฆฝํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ ํจ์จ์ ์ด๊ณ ์ ์ฐํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ Apache License 2.0 ํ์ ๋ผ์ด์ ์ค๊ฐ ๋ถ์ฌ๋์์ต๋๋ค.
