我定义了两个HTTP GET API / test-mono和/ test-no-mono,除了/ test-mono使用Mono返回类型外,它们完全相同。 HelloControllerSpec使用100的线程池对这两个API进行了1000次测试,/ test-no-mono需要45秒,而/ test-mono需要4分钟以上,为什么?看起来在/ test-no-mono的默认并发配置中比/ test-mono更好。
完整代码位于https://github.com/soumitrak/micronaut-server
@Controller("/")
class HelloController {
@Get("test-mono/{id}", produces = arrayOf(MediaType.APPLICATION_JSON))
fun test_mono(id: String): Mono<String> {
Thread.sleep(4000)
return Mono.just("Hello World! $id")
}
@Get("test-no-mono/{id}", produces = arrayOf(MediaType.APPLICATION_JSON))
fun test_no_mono(id: String): String {
Thread.sleep(4000)
return "Hello World! $id"
}
}
$ ./gradlew干净测试
任务:test
sk.test.server.HelloControllerSpec STANDARD_OUT
09:37:32.473 [Test worker] INFO i.m.context.env.DefaultEnvironment - Established active environments: [test]
sk.test.server.HelloControllerSpec>使用Mono STANDARD_OUT
09:37:34.262 [Test worker] INFO sk.test.server.HelloControllerSpec - Tests using mono
09:41:46.972 [Test worker] INFO sk.test.server.HelloControllerSpec - Done tests using mono
sk.test.server.HelloControllerSpec>不具有Mono STANDARD_OUT
09:41:46.975 [Test worker] INFO sk.test.server.HelloControllerSpec - Tests without mono
09:42:27.216 [Test worker] INFO sk.test.server.HelloControllerSpec - Done tests without mono
“ / test-mono”运行缓慢的原因是什么?如何改善此API的性能?
答案 0 :(得分:0)
您的测试方案是不现实的。您永远不应阻塞事件循环,这是调用Thread.sleep时正在执行的操作。阻塞代码的性能更好,因为它具有更多线程。在现实情况下,添加更多线程并不是获得更好性能的答案。