欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
本文由 ImportNew - 唐尤华 翻译自 dev.to。接待插手翻译小组。转载请见文末要求。

“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 参数