“Spring有多快?”
这是 2018 Spring One Platform 中的一场集会会议。看完集会会议视频,我本身动手试了一下。下面是我做出的测试功效。
还没有寓目视频的伴侣推荐看一下,很是有意思。
https://springoneplatform.io/2018/sessions/how-fast-is-spring-
本文利用的代码
https://github.com/bufferings/spring-boot-startup-mybench
↓我利用的是 OpenJDK 11。
❯ java --version openjdk 11.0.1 2018-10-16 OpenJDK Runtime Environment 18.9 (build 11.0.1+13) OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
↓可以凭据下面这样运行基准测试。运行起来大概需要一些时间,下面会执行所有的测试。
❯ ./mvnw clean package ❯ (cd benchmarks/; java -jar target/benchmarks.jar)
1. FluxBaseline
↓我利用 SpringInitializr 建设项目,劳务派遣管理系统,仅包括 Reactive Web。接下来,我会写一个 WebMVC 气势气魄的极简controller。
@SpringBootApplication @RestController public class DemoApplication { @GetMapping("/") public String home() { return "Hello"; } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
↓Spring Boot 版本是 2.1.0.RELEASE。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
↓启动功效 2.938 ± 0.287 s/op。
Benchmark Mode Cnt Score Error Units MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
此刻,以这个功效作为基线。让我们从这里开始。
2. WebMVC
↓我很好奇为什么要用 WebMVC 而不是 WebFlux? 我实验了一下。也许仅仅是为了较量 Tomcat 和 Netty?
Benchmark Mode Cnt Score Error Units MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op MyBenchmark.case02_Web ss 10 3.281 ± 0.342 s/op
WebFlux 快了一点,莫非不是吗?
3. spring-context-indexer
接下来,我试了 spring-context-indexer,好像建设了 component index。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-indexer</artifactId> <optional>true</optional> </dependency>
↓嗯…慢了一点点?
Benchmark Mode Cnt Score Error Units MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op MyBenchmark.case03_WithContextIndexer ss 10 3.063 ± 0.102 s/op
↓我查抄了 spring.components,发明只包括了一个组件。相识...我应该实验更大一点的项目,这样才气看到结果。
# #Sun Nov 04 18:42:59 JST 2018 com.example.DemoApplication=org.springframework.stereotype.Component
4. 惰性初始化
实验了惰性初始化。
@Configuration public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { for (String beanName : beanFactory.getBeanDefinitionNames()) { beanFactory.getBeanDefinition(beanName).setLazyInit(true); } } }
↓查察功效,劳务派遣管理系统,启动变快了一点。
Benchmark Mode Cnt Score Error Units MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op MyBenchmark.case04_WithLazyInit ss 10 2.844 ± 0.129 s/op
5. NoVerify
运行加 -noverify 选项:
Benchmark Mode Cnt Score Error Units MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op MyBenchmark.case05_WithNoVerifyOption ss 10 2.582 ± 0.060 s/op
启动变得快了一点。不知道为什么有这个功效,稍后需要仔细相识一下。
6. TieredStopAtLevel
运行加 -XX:TieredStopAtLevel=1 选项:
Benchmark Mode Cnt Score Error Units MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op MyBenchmark.case06_WithTieredStopAtLevel1Option ss 10 1.980 ± 0.037 s/op
嗯,快多了!淘汰了险些2秒。照旧不知道这个参数有什么寄义,稍后需要仔细相识一下。
7. 指定 SpringConfigLocation 参数