Gradle和Maven性能对比

Stella981
• 阅读 860

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和Maven性能对比 Gradle在运行测试上快了1.7倍,而在开启cache的时候快了30倍!

小型复合项目构建场景

这里是对一个包含10个模块的项目进行常见任务测试的结果,和微服务项目非常相似。每个子项目含有50个源文件和50个测试文件。

Gradle和Maven性能对比

Gradle在纯净构建上快2-3倍,而在增量构建上快了7倍,在Gradle任务输出被缓存的情况下可以提升至14倍。

这个GIF动图并排显示了clean build场景下的构建,因此你可以直观地看到差别(在没有开启构建缓存的情况下)。

Gradle和Maven性能对比

中型复合项目构建场景

这里是对一个单个仓库包含了100个模块的复合项目进行常见任务测试的结果。每个子项目包含100个源文件和100个测试文件。

Gradle和Maven性能对比

Gradle在纯净构建时快4-5倍,在增量构建是快大约40倍,在Gradle任务输出被缓存的情况下可以提升到13倍。

大型复合项目构建情景

这里是对一个单仓库中包含500个模块的复合项目运行常见任务的测试。每个子项目包含100个源文件和100个测试文件。

Gradle和Maven性能对比

Gradle在纯净构建时快3-10倍,在增量构建时快大约85倍,而在缓存了Gradle任务输出的时候快了13倍。

大型单项目场景

虽然很少在一个项目中包含所有代码,但是多模块构建中这种情况非常常见,其中大多数代码都位于一个或几个模块中,这些模块比其他模块大得多。这个场景是这类项目的近似——单个项目中包含了50000万源文件和50000个测试文件。

Gradle和Maven性能对比

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以上,守护进程就不会被系统杀掉了。

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
springCloud 搭建eureka服务之天坑
这里我是采用gradle来管理jar包的。1、使用idea创建一个gradle项目。2、编辑settings.gradle文件rootProject.name'jtm'//include'jtm_core'//include'jtm_sys'//include'jtm_eureka'
Wesley13 Wesley13
3年前
gradle配置本地mavn仓库 mavenLocal() 时的bug
最近在学习Gradle,在配置maven仓库时遇到一个很奇怪的问题。因为之前已经在自己机器上下载了一些maven的本地缓存,所有在使用gradle时想优先从本地的仓库中下载jar,查看了官方的userguide文档,发现其中有这么一段:大概意思是说使用mavenLocal()配置maven的本地仓库后,gradle默认会按以下顺序去查找本地的仓库
Stella981 Stella981
3年前
Gradle的安装与配置及Spring源码导入(亲测)
前言我这边使用的gradle版本是:gradle6.5.1idea版本是:ideaIU2019.3.1jdk:1.8Gradle简介Gradle是源于ApacheAnt和ApacheMaven概念的项目自动化构建开源工具,它使用一种基于Groovy的的特定领域语言(
Stella981 Stella981
3年前
Gradle 初体验
gradle以配置精简,使用方便在业内最近比较流行,那么我们也开始玩玩0.为什么要用/学gradle?1.目前很多开源项目已经使用gradle取代maven,比如hibernate,springsession,如果不会gradle的话,那么会增加学习这类项目的难度
Stella981 Stella981
3年前
Maven Wrapper简介
MavenWrapper简介简介开发java项目少不了要用到maven或者gradle,对比gradle而言,可能maven要更加常用一些。要使用maven那就必要要安装maven,如果有些用户不想安装maven怎么办?或者说用户不想全局安装maven,那么可以使用项目级别的MavenWrapper来实现这个功能。如果大家使用Intel
Stella981 Stella981
3年前
HarmonyOS应用开发引入第三方库的三种方式
我们在做应用开发的时候,往往需要引入些优秀的第三方库来进行开发,下面就讲讲我们在做HarmonyOS应用开发中引入第三方库的三种方式。1、通过编写gradle依赖进行引入,熟悉maven或者gradle的朋友对这个就太熟悉了。针对这个方式,我就拿个fastjson库的引入进行举例吧,在对应的Module下的build.gradle文件中添加依赖项即可
Stella981 Stella981
3年前
Gradle使用杂记
1、配置环境变量GRADLE\_HOME2、把gradle缓存目录指向了gradle安装目录下的.gradle目录,设置环境变量GRADLE\_USER\_HOMEGRADLE\_USER\_HOME%GRADLE\_HOME%\\.gradle或者指定目录GRADLE\_USER\_HOMED:\\gradle\\.grad
Stella981 Stella981
3年前
Gradle之介绍
Gradle是基于JVM构建工具的新一代版本。它从现有的构建工具如Ant和Maven中学到了很多东西,并且把它们的最优思想提升到更高层次。遵循基于约定的构建方式,Gradle可以用一种声明式的方式为你的问题领域建模,它使用一种强大的且具有表达性的基于Groovy的领域特定语言(DSL),而不是XML,因为Gradle是基于JVM的,它允许你使用自己最喜欢的J
Stella981 Stella981
3年前
Grunt 新手指南
导言作为一个正在准备从java后端转大前端,一直都有想着,在js的世界里面有没有类似于maven或者gradle的东西..然后,就找到了grunt这玩意<!moreGrunt是用来干什么的诸如ant,maven,gradle,make之流的,那么我们为什么要学这么一个工具了,我们用IDE编程不是好好的吗,要让人