专栏首页乐百川的学习频道Gradle和Maven性能对比

Gradle和Maven性能对比

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/u011054333/article/details/103221226

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Gradle 5.0 更新介绍

    版权声明:本文为博主原创文章,转载请注明出处。 ...

    乐百川
  • Visual Studio Code 1.35更新:远程开发终于来啦

    版权声明:本文为博主原创文章,转载请注明出处。 ...

    乐百川
  • 巧用符号链接移动文件夹位置

    有些时候我们可能因为系统或者某些软件的缓存占得比较多,想把他们从C盘移动到其他地方。但是软件本身并没有提供修改缓存文件夹的功能。这下应该怎么办呢?其实还真有一个...

    乐百川
  • Gradle 概述

    Gradle 是一个开源的构建自动化(build automation)工具。有关构建自动化的定义请参考:https://en.wikipedia.org/wi...

    HoneyMoose
  • MAC上使用Android Studio 3.0的Gradle问题小解

    2017-06-11 by Liuqingwen | Tags: Android Gradle | Hits

    IT自学不成才
  • 说实话,用完Gradle之后,有点嫌弃Maven了。贼好用!

    相信使用 Java 的同学都用过 Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用 Maven,可能会发现 Maven 有一些地方用的让人不太...

    用户6543014
  • 在Eclipse中使用Gradle开发web3j以太坊应用

    在我们的web3j以太坊开发课程中,预置代码是在终端命令行使用gradle进行构建的。如果希望在熟悉的Eclipse中开发web3j以太坊应用,这个快速教程将告...

    笔阁
  • SAP Hybris安装包里自带的Maven和Gradle

    Wrapper是对Gradle的包装, 确保团队开发过程中使用统一的Gradle版本。

    Jerry Wang
  • 看似无用,实则重要的Gradle Wrapper

    在本系列的此前文章中,我们学习了为什么要用Gradle、Gradle的入门基础和Groovy的基础,这些文章为Gradle的入门打下了基础,这一篇我们接着学习G...

    用户1269200
  • Gradle 提速:每天为你省下一杯喝咖啡的时间

    作为一名 Android 开发同学,当你的工程和代码达到一定规模的时候,相信你一定遇到过编译速度过慢的问题。比如:

    我就是马云飞

扫码关注云+社区

领取腾讯云代金券