Gradle目前已经出到6.0版本了,想当初我第一次了解到Gradle的时候,它仅有2.0版本,这些年来一直不断迭代和优化,现在可以说是非常成熟好用的一款工具。如果大家还在使用Maven,我建议大家学习一下Gradle,现在Gradle的性能可以说是完全超越了Maven,各种平台也早已支持Gradle。可以说,除非是兼容老项目,否则,完全可以用Gradle来替代Maven。
Gradle显然也对自己的性能很有信息,官网也专门留了一个地方,对Gradle和Maven进行了全方位的性能对比,对比结果很显然,Gradle在各种方面都超越了Maven。我简单翻译了一下,大家可以看看。当然如果大家想看更详细的对比,可以直接查看官网的详细说明。
各场景下的性能对比
Java类库场景
为了测试对典型Java类库项目的影响,我们将Apache Commons Lang 3项目从Maven迁移到了Gradle(使用Java库插件)。
Gradle在运行测试上快了1.7倍,而在开启cache的时候快了30倍!
小型复合项目构建场景
这里是对一个包含10个模块的项目进行常见任务测试的结果,和微服务项目非常相似。每个子项目含有50个源文件和50个测试文件。
Gradle在纯净构建上快2-3倍,而在增量构建上快了7倍,在Gradle任务输出被缓存的情况下可以提升至14倍。
这个GIF动图并排显示了clean build场景下的构建,因此你可以直观地看到差别(在没有开启构建缓存的情况下)。
中型复合项目构建场景
这里是对一个单个仓库包含了100个模块的复合项目进行常见任务测试的结果。每个子项目包含100个源文件和100个测试文件。
Gradle在纯净构建时快4-5倍,在增量构建是快大约40倍,在Gradle任务输出被缓存的情况下可以提升到13倍。
大型复合项目构建情景
这里是对一个单仓库中包含500个模块的复合项目运行常见任务的测试。每个子项目包含100个源文件和100个测试文件。
Gradle在纯净构建时快3-10倍,在增量构建时快大约85倍,而在缓存了Gradle任务输出的时候快了13倍。
大型单项目场景
虽然很少在一个项目中包含所有代码,但是多模块构建中这种情况非常常见,其中大多数代码都位于一个或几个模块中,这些模块比其他模块大得多。这个场景是这类项目的近似——单个项目中包含了50000万源文件和50000个测试文件。
Gradle在纯净构建时快2-3倍,在增量构建时快大约7倍,在Gradle任务输出被缓存的时候快3倍。
性能对比总结
- 在所有场景下,Gradle都至少比Maven快2倍
- 当增量构建时,Gradle比Maven快7-85倍,子项目越多,Gradle快的越多
- 当Gradle的构建缓存可以解析任务输出的时候,Gradle比Maven快3-30倍
Gradle的性能优势
Gradle实现了大量策略来保证构建速度更快:
- Gradle守护线程可以保证构建信息足够新
- 针对各种类型任务的增量任务输入和输出确保不需要每次运行清理命令
- 增量编译可以分析源文件和类文件之间的依赖关系,并只重新编译改变的部分
- 当二进制接口没有改变的时候,Gradle的智能类路径分析器避免了不必要的编译
- 利用Java类插件来提供更好的建模,减少了编译时类路径的体积,提高了性能
所有这些特性结合在一起,造成了Gradle和Maven巨大的性能差异。
解决Gradle速度慢的问题
好了,以上就是官网的一些说明,相信很多同学之前可能也试用过Gradle,但是发现性能不太理想。这里我来解释一下原因。
下载Gradle Wrapper慢
这应该是最常见的原因了,Gradle Wrapper可以说是一个好东西,不需要我们专门下载和配置Gradle,利用wrapper就可以自动下载指定版本的Gradle。wrapper会自动将命令代理到gradle上。这个东西的设计理想很美好,其实用起来也挺美好,但是对于国内的朋友就不太美好了。很多情况下我们连Maven官方源上的包都下不动, 更别说在专门下载Gradle了。
这个问题解决办法有两个,第一个是弄个代理,估计很多程序员为了方便都会自己弄一个。第二个办法是自己专门下一个Gradle,然后设置项目改用本地Gradle,这样就会避免每次wrapper的下载。
仓库下载慢
这个问题很好解决,Maven的话我们可以设置镜像仓库,Gradle也支持这么干。
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
jcenter()
}
Gradle运行速度慢
其实初次运行的话,Gradle和Maven速度差不多,当然还是Gradle稍快一些。有了构建数据之后,第二次运行应该会比Maven快很多,特别是如果你重复运行测试这些东西,而代码没有改动的话,Gradle几乎是秒运行,原因上面也介绍过了。其中一个原因就是Gradle守护进程会在后台不停地运行,收集各种数据。
如果你Gradle运行的速度很慢,可以注意一下运行的时候是不是需要重新运行守护进程,正常情况下仅仅第一次才会运行。如果守护进程不断重启的话,可能是你机器内存不够用,毕竟Gradle守护进程也是一个Java程序,内存不够的话便会被杀掉。
这种情况没有什么好的解决办法,基本上唯一办法就是加内存。说实话8G内存可能不够用, 有条件的话最好加到16G以上,守护进程就不会被系统杀掉了。