Optimize Coroutine invocations

KClass instantiation in CoroutinesUtils is suboptimal, and should be
replaced by KTypes#isSubtypeOf checks using pre-instantiated types for
Flow, Mono and Publisher.

This commit impact on performances is significant since a throughput
increase between 2x and 3x has been measured on basic endpoints.

Closes gh-32390
This commit is contained in:
Sébastien Deleuze
2024-03-07 14:27:47 +01:00
parent 6d9a2eb9b8
commit 579dbc48d7
2 changed files with 50 additions and 13 deletions

View File

@@ -97,6 +97,29 @@ class CoroutinesUtilsTests {
Assertions.assertThatIllegalArgumentException().isThrownBy { CoroutinesUtils.invokeSuspendingFunction(method, this, "foo") }
}
@Test
fun invokeSuspendingFunctionWithMono() {
val method = CoroutinesUtilsTests::class.java.getDeclaredMethod("suspendingFunctionWithMono", Continuation::class.java)
val publisher = CoroutinesUtils.invokeSuspendingFunction(method, this)
Assertions.assertThat(publisher).isInstanceOf(Mono::class.java)
StepVerifier.create(publisher)
.expectNext("foo")
.expectComplete()
.verify()
}
@Test
fun invokeSuspendingFunctionWithFlux() {
val method = CoroutinesUtilsTests::class.java.getDeclaredMethod("suspendingFunctionWithFlux", Continuation::class.java)
val publisher = CoroutinesUtils.invokeSuspendingFunction(method, this)
Assertions.assertThat(publisher).isInstanceOf(Flux::class.java)
StepVerifier.create(publisher)
.expectNext("foo")
.expectNext("bar")
.expectComplete()
.verify()
}
@Test
fun invokeSuspendingFunctionWithFlow() {
val method = CoroutinesUtilsTests::class.java.getDeclaredMethod("suspendingFunctionWithFlow", Continuation::class.java)
@@ -213,6 +236,16 @@ class CoroutinesUtilsTests {
return value
}
suspend fun suspendingFunctionWithMono(): Mono<String> {
delay(1)
return Mono.just("foo")
}
suspend fun suspendingFunctionWithFlux(): Flux<String> {
delay(1)
return Flux.just("foo", "bar")
}
suspend fun suspendingFunctionWithFlow(): Flow<String> {
delay(1)
return flowOf("foo", "bar")