作者:唐友华来源:http://www.importnew.com/30647.html 《春天有多早?》
这是2018 年Spring One 平台会议。看完会议视频后,我决定自己尝试一下。以下是我所做的测试的结果。
我推荐还没看过视频的朋友看一下,因为它很有趣。
https://springoneplatform.io/2018/sessions/how-fast-is-spring-
本文使用的代码
https://github.com/bufferings/spring-boot-startup-mybench
我正在使用OpenJDK11。
java --versionopenjdk 11.0.1 2018-10-16OpenJDK 运行时环境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 风格的最小控制器。
然后使用这个结果作为你的基线。让我们从这里开始吧。
2. WebMVC
我想知道为什么我应该使用WebMVC而不是WebFlux?难道只是为了比较Tomcat和Netty吗?
WebFlux 更快一些。
3. spring-context-indexer
接下来,我尝试了spring-context-indexer,它似乎索引了该组件。
4. 惰性初始化
尝试进行延迟初始化。
启动速度稍快一些。我不知道为什么会这样。稍后我将不得不进一步研究它。
使用
6. TieredStopAtLevel
-XX:TieredStopAtLevel=1 选项运行。
是的,快得多。这将节省大约2 秒。我还是不明白这个参数是什么意思。稍后您将需要了解更多信息。
使用
7. 指定 SpringConfigLocation 参数
-Dspring.config.location=classpath:/application.properties 选项运行。
基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case07_WithSpringConfigLocationOption ss 10 3.026 0.139 s/op 好吧,又慢了。
使用
8. 关闭 JMX
-Dspring.jmx.enabled=false 选项运行。
基准模式Cnt 分数误差单位MyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case08_WithJmxDisabledOption ss 10 2.877 0.097 s/op 稍快一些。
9. 取消 Logback
这里开始减少函数库。启动和取消logback。
依赖项groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId 排除排除artifactIdspring-boot-starter-logging/artifactId groupIdorg.springframework.boot/groupId /exclusion /exclusions/dependency 依赖项groupIdorg.slf4j/groupId artifactIdslf4j 这里有-jdk14/artifactId/dependencies 的结果:
基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case09_WithoutLogback ss 10 2.904 0.096 s/op 嗯.似乎有所改善?
10. 取消 Jackson
下一个是杰克逊。
依赖项groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId Exclusion 排除artifactIdspring-boot-starter-json/artifactId groupIdorg.springframework.boot/groupId /exclusion /exclusions/dependency 结果为:
基准模式Cnt 分数误差单位MyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case10_WithoutJackson ss 10 2.789 0.093 s/op 结果稍快一些。
11. 取消 HibernateValidator
依赖groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId排除排除artifactIdhibernate-validator/artifactId groupIdorg.hibernate.validator/groupId /exclusion /exclusions/dependency 结果是:
基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case11_WithoutHibernateValidator ss 10 2.857 0.084 s/op 也有一些影响。
至此,函数库就不再被取消了。
12. AppCDS
AppCDS(应用程序类数据共享)是Oracle JDK 企业版的一项功能。 OpenJDK 10 开始包含此功能。
AppCDS转储信息似乎保存在共享zip文件中,这减少了启动时间。
Benchmark Mode Cnt Score Error UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case12_WithAppCds ss 10 2.957 0.079 s/op 嗯.它没有变得更快.所以我阅读了有关CDS 的相关文章并找出了原因。
SpringBoot FatJAR 不受CDS 的控制。
13. 使用 Thin Launcher 的 Flux
抱歉,“爆炸”基准不正确。我尝试使用FatJAR,但CDS 不允许我这样做。所以,我改用Thin Launcher,于是“Exploded”就变成了“Thin Launche”。
在使用CDS之前,请先测试一下使用Thin Launcher打包JAR文件的启动速度。
插件插件groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId 依赖项依赖项groupIdorg.springframework.boot.experimental/groupId artifactIdspring-boot-thin-layout/artifactId version1.0.15.RELEASE/version/dependency/dependency/插件/插件我使用Thin Launcher 来打包我的应用程序,但我不使用Thin Launcher 启动类,而是使用Main 类来使启动尽可能快。
基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case13_Exploded ss 10 2.476 0.091 s/op 嗯,速度有点快,对吧?
14. Thin Launcher + CDS
接下来,使用AppCDS。
基准模式Cnt 分数误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case14_ExplodedWithAppCds ss 10 1.535 0.036 s/op 更快!
15. 所有操作都上
终于用完了所有的操作。
基准模式Cnt 分数误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case15_AllApplied ss 10 0.801 0.037 s/op 不到1 秒! (´)是的
更进一步
Dave 的视频提到“Functional Bean Definition”,当我尝试仅使用Spring 而不使用SpringBoot 时,我的应用程序变得更快。其中的道理还需要进一步理解。
结果:
非常有趣。谢谢你!
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。