野生技术宅协会

Gradle和Maven性能对比

2019-11-24  本文已影响0人  乐百川

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库插件)。

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的性能优势

Gradle实现了大量策略来保证构建速度更快:

所有这些特性结合在一起,造成了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以上,守护进程就不会被系统杀掉了。

上一篇下一篇

猜你喜欢

热点阅读