2.2 两种框架的性能比较

Quarkus围绕容器优先和Kubernetes的Native理念进行设计,优化低内存使用率和快速启动时间。Quarkus还尽可能避免反射,而倾向于静态类绑定。这些设计原则减小了JVM上运行的应用程序的大小,并最终减少了内存占用,同时也使Quarkus成为“原生(Native)”的。Quarkus的设计从一开始就考虑了原生编译。它被优化为使用GraalVM的原生镜像功能将JVM字节码编译为原生二进制。

在撰写本书时,Spring中类似的原生镜像功能仍被认为是实验性的或Beta版的。Spring支持原生编译的功能并没有提供所有相同的编译时优化和设计选择,使Quarkus在JVM上或原生镜像中运行时速度极快,内存效率极高。

下面做一个有趣的实验来验证一下这两个框架的性能,分别编写Spring和Quarkus的两个程序(程序源码见参考文献)。

1)准备:首先把Quarkus程序分别编译成原生程序和JVM程序,把Spring程序也编译成JVM程序。然后把Quarkus原生程序和Quarkus的JVM程序部署到容器镜像中,把Spring的JVM程序也部署到容器镜像中。可分别部署在不同的操作系统中,分别是Mac OS和Ubuntu操作系统。

2)测试:启动这3个容器,让它们运行几次,然后比较启动时间和内存占用情况。在这个过程中,每一个容器都被创建和销毁了10次。随后分析它们的启动时间和内存占用情况。下面显示的数字是基于所有这些测试的平均结果。

3)比较和分析:比较的指标主要是启动时间和内存占用情况。

启动时间的比较如图2-3所示。原生的Quarkus的耗时只有0.01s,即使是在JVM下使用Docker镜像的Quarkus应用程序,其启动时间也比Spring Boot快。而Quarkus原生应用程序是迄今为止启动速度最快的应用程序。

•图2-3 3个程序的启动时间比较

内存占用情况比较如图2-4所示。检查每个容器的应用程序在启动时需要消耗多少内存,以便启动和运行,并准备好接收请求。

•图2-4 3个程序占用内存情况比较

原生的Quarkus的内存耗费只有2.1MB,即使是在JVM下使用Docker镜像的Quarkus应用程序,其内存占用也比Spring Boot低。

4)结论:图2-5是在Ubuntu Linux中得到的结果。

两者比较,似乎Quarkus框架赢得了战斗(启动时间和内存占用),以一些明显的优势战胜了Spring Boot框架。

•图2-5 3个程序的性能对比