Webflux 和 MVC 性能对比

1. 前言
最近在网上看到,很多人都讲 Spring Boot Webflux 要超过 SpringMVC ,感觉在高并发的场景下, Spring Boot Webflux 简直就是银弹。

2. 准备
首先介绍一下本人的硬件情况:

CPU:因特尔的 i7-8700
内存:16G DDR4 2666
系统:win10

压测工具选择 Apache 的 jmeter ,版本为 5.1.1 (版本稍老,笔者未下载最新版本)

了解源码可+求求: 1791743380

接下来就是两个工程了。

SpringMVC 测试代码如下:

代码清单:spring-boot-analysis/spring-boot-mvc-latency/src/main/java/com/springboot/springbootmvclatency/controller/HelloController.java

@RestController
public class HelloController {

    @GetMapping("/hello/{latency}")
    public String hello(@PathVariable Long latency) {
        try {
            TimeUnit.MILLISECONDS.sleep(latency);
        } catch (InterruptedException e) {
            return "Error during thread sleep!";
        }
        return "Hello World!";
    }
}

Spring Boot Webflux 测试代码如下:

代码清单:spring-boot-analysis/spring-boot-webflux-latency/src/main/java/com/springboot/springbootwebfluxlatency/controller/HelloController.java

@RestController
public class HelloController {
    @GetMapping("/hello/{latency}")
    public Mono<String> hello(@PathVariable int latency) {
        return Mono.just("Welcome to reactive ~")
                .delayElement(Duration.ofMillis(latency)); // 1
    }
}

这两个服务分别配置不同的端口启动。

3. 压测
我计划以分别以 50 、100 、200 并发压测 1 分钟,查看两个服务的结果,因为 SpringBoot 中 tomcat 如果不做配置,最大线程数是 200 ,笔者这里偷个懒。

注意: 本次压测结果仅供参考。

3.1 50并发
SpringMVC 聚合数据:
Webflux 和 MVC 性能对比_第1张图片
SpringMVC JVM :
Webflux 和 MVC 性能对比_第2张图片
Spring Boot Webflux 聚合数据:
Webflux 和 MVC 性能对比_第3张图片
Spring Boot Webflux JVM :
Webflux 和 MVC 性能对比_第4张图片
可以看到,在50并发的情况下, Spring Boot Webflux 的吞吐量甚至还有不如。但是 SpringMVC 的活动线程数飙升到了 69 ,而 Spring Boot Webflux 的线程数则稳定在 36 。

3.2 100并发
SpringMVC 聚合数据:
Webflux 和 MVC 性能对比_第5张图片
SpringMVC JVM :
Webflux 和 MVC 性能对比_第6张图片
Spring Boot Webflux 聚合数据:
Webflux 和 MVC 性能对比_第7张图片
Spring Boot Webflux JVM :
Webflux 和 MVC 性能对比_第8张图片
在这组对照中,可以看到 Spring Boot Webflux 的吞吐量是超过了 SpringMVC (虽然超过的比较少),并且 Spring Boot Webflux 对 CPU 的消耗是要比 SpringMVC 小将近一半。

3.4 300 并发
SpringMVC 聚合数据:
Webflux 和 MVC 性能对比_第9张图片
SpringMVC JVM :
Webflux 和 MVC 性能对比_第10张图片
SpringMVC 响应时间:
Webflux 和 MVC 性能对比_第11张图片
Spring Boot Webflux 聚合数据:
Webflux 和 MVC 性能对比_第12张图片
Spring Boot Webflux JVM :
Webflux 和 MVC 性能对比_第13张图片
Spring Boot Webflux 响应时间:
Webflux 和 MVC 性能对比_第14张图片
在这组对照中,可以看出 Spring Boot Webflux 吞吐量超过 SpringMVC 将近三分之一,从时间响应图上也可以看到 Spring Boot Webflux 上涨的幅度是要小于 SpringMVC 的。

4. 小结
首先, Spring Boot Webflux 的 CPU 使用率小于 SpringMVC 这点是我在测试前就已经预料到的,毕竟 Spring Boot Webflux 是非阻塞式的 I/O ,而 SpringMVC 则是阻塞式的, Spring Boot Webflux 的活动线程数是固定的,这就大大的减少了 CPU 在线程中切换的消耗。但是在并发未到 200 之前, Spring Boot Webflux 相比较 SpringMVC 并没有明显的优势,相反还有点不如,这是我没想到的(有哪位朋友知道原因的可以一起交流下),当然,我的实验仅能做一个参考作用,毕竟只进行了一次测试,并未多次测试取平均,偶然性还是相当大的。

你可能感兴趣的:(Webflux 和 MVC 性能对比)