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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user