V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HojiOShi
V2EX  ›  Android

为什么在 Linux 下构建 APK 比用 Windows 快非常多

  •  
  •   HojiOShi · 13 天前 · 5281 次点击

    我用两台机器,一台 5600X 一台 7950X 。 5600X 那台装的是 Ubuntu 24.04 ,7950X 那台装的是 Windows 10 。 两个系统都已经更新到最新补丁,已经尽可能清空后台程序,且内存存储非常富裕。

    对公司项目使用命令行工具构建出 release 版本的 APK 并且计时。 结果测速发现 7950X 构建花了 7 分 8 秒,5600X 花了 5 分 12 秒。是的你没看错,测了三次都差不多这结果。 更离谱的是 5600X 我甚至还把项目文件放在机械硬盘上的,没想到还是被碾压了。

    公司项目也没啥特别的:AGP 8.9 代码规模也就 6w 行左右 过八成 java+不足两成 kotlin ,没有 native 代码,就这个样子。 构建任务:构建一个大的 app 模块的 3 个 variant (全 java )和两个小的 app 模块(全 kotlin ),总共 5 个 APK 文件。这三个模块除了共享了定义数据协议结构的库以外基本独立。测试之前已经预先构建过,用于把依赖下载完整,所以不存在网络波动导致的时间差异。

    原本以为 7950X 的构建速度上理应碾压 5600X 的,就算系统不同,也不应该有这么大的差距。 实在想不出为什么会有这样的结果。 在 Windows 上我还特意用了Microsoft Build of OpenJDK 21的。

    28 条回复    2025-03-21 15:47:00 +08:00
    heiher
        1
    heiher  
       13 天前
    Windows 试试关闭任何杀毒或防护监控软件。
    tool2dx
        2
    tool2dx  
       13 天前
    把步骤用时都打印出来啊,我这里 debug 版本都差不多。

    release 的话,很多 CPU 时间都花在了 assets 压缩上面,也许你的 5600X 对压缩算法有特别优化。
    codehz
        3
    codehz  
       13 天前 via Android   ❤️ 2
    windows 启动进程速度天然会慢很多,安卓构建需要开一堆进程,这一点就会消耗大量时间了
    liyafe1997
        4
    liyafe1997  
       13 天前   ❤️ 2
    盲猜文件系统系统,盲猜是由于安全软件(特别是 Windows Defender )引起的
    YsHaNg
        5
    YsHaNg  
       13 天前 via iPhone
    Windows 开 dev drive 扔进去再试
    HojiOShi
        6
    HojiOShi  
    OP
       13 天前
    @heiher @liyafe1997 用 Defender Control 关了 WD 之后,7950X 的时间缩短到了 5 分 51 秒,效果显著但和 5600X 仍有差距。
    smartruid
        7
    smartruid  
       13 天前 via iPhone
    你在 windows 上用 wsl 也会更快
    HojiOShi
        8
    HojiOShi  
    OP
       13 天前
    @tool2dx @codehz 姑且用 --profile 再跑了一次。
    这东西好像坏了,点 Task Execution 看不到每个任务的执行时间,也可能是我没是经过 Android Studio 的,只用命令行工具导致的行为变动。

    但发现了个有意思的现象:全 java 的大 app 模块构建花了 3 分钟以上,7950X 也不过多了十秒钟构建时间;而时间差距基本全集中在了那两个全 kotlin (可能也不是全 Kotlin ,至少依赖的协议库用 java 的)的小 app 模块构建任务上。
    mayli
        9
    mayli  
       13 天前
    盲猜是杀毒软件,windows 11 还专门为这个做了个 dev drive, 相当于默认整盘白名单,可以用那个试下。如果还有差距,那就是系统优化方向差异了,linux 大部分优化是注重吞吐量,牺牲延迟,windows 相反,所以有些重量级场景,比如编译大项目,就会慢。
    mayli
        10
    mayli  
       13 天前
    还有个可能的是处理器问题,5600 的话是单 ccx, l3 的命中率可能会比多 ccx 的高,假如 java 编译比较吃这个,那就有可能 7950x 会慢。
    flynaj
        11
    flynaj  
       13 天前 via Android
    不用怀疑,NTFS 的性能确实不如 ext4 ,但是影响整体编译速度差距也只是在 20%,过高按照这个设置一下, https://stackoverflow.com/questions/6916011/how-do-i-get-windows-to-go-as-fast-as-linux-for-compiling-c
    debuggeeker
        12
    debuggeeker  
       13 天前
    之前电脑安装黑苹果,同样的配置,黑苹果打包同一个项目速度是 win10 快很多,没测试过 Ubuntu
    xdeng
        13
    xdeng  
       13 天前
    傻 x Defender
    ByePrd
        14
    ByePrd  
       13 天前
    MS: ./gradlew.bat build --scan
    ByePrd
        15
    ByePrd  
       13 天前
    @ByePrd #14 Linux: ./gradlew build --scan ,看下耗时对比。
    gaifanking
        16
    gaifanking  
       13 天前
    遇到过,同一台电脑上 wsl 编译比 win11 快。同样百思不得其姐
    HojiOShi
        17
    HojiOShi  
    OP
       12 天前
    @mayli #10 这个原因挺新鲜的。

    @flynaj #11 感谢,步骤挺多,以后再看看。

    @debuggeeker #12
    @gaifanking #16
    吼,看起来确实不是个例。

    @ByePrd #14 #15 --scan 上传的信息会暴露一些隐私还没法改,之后我自己看看吧。
    xausky
        18
    xausky  
       12 天前
    很多东西在 Linux 上跑就是比在 Windows 上跑要快很多,文件系统,内核调用等等原因,Linux 内核本身也为大吞吐量而优化,其他的都是为顺畅优化,(大吞吐量:30s 完成但是报告进度可能会卡,顺畅:每秒都准确报告进度但是 60s 才能完成),顺便也比在 MacOS 上跑快(因为硬件不同有点虚空论武)
    debuggeeker
        19
    debuggeeker  
       12 天前
    @xausky 要对比也可以,一个超大硬盘,电脑上面同时安装 Ubuntu ,黑苹果,win ,编译同一个项目
    MoeDisk
        20
    MoeDisk  
       12 天前
    文件系统和调度的问题。
    (参照 MTP 协议两者下对比或 FastCopy 策略(
    moefishtang
        21
    moefishtang  
       12 天前
    好奇 Windows Server 上构建速度与 Windows 有什么差异
    调整高级系统设置里的处理器偏好会不会有作用?
    xausky
        22
    xausky  
       12 天前
    @debuggeeker 果粉要跟你说:什么,黑苹果也能代表苹果?
    lisxour
        23
    lisxour  
       12 天前
    楼上怎么全是怪系统的,有没有考虑过工具链不一样?
    huangzhiyia
        24
    huangzhiyia  
       11 天前
    关闭杀毒软件,关闭索引。效果显著,不过( •̀ ω •́ )y ,顶配 MacBook air 下一个月就到了,彻底和 Windows 说拜拜。
    HangoX
        25
    HangoX  
       11 天前
    不用测试了,window 上是比 linux 上慢的,window 上主要问题是没法给你编译进程非常高的 CPU 使用率,都是不到 90% 跳动的,linux 下可以。我的测试环境是,window 上装 vbox 虚拟 linux ,也是编译比 window 上快。
    debuggeeker
        26
    debuggeeker  
       10 天前
    @HangoX 为什么不能给高 CPU 使用率呢,这个问题我最近发现编译的时候,CPU 使用率真的很低,i912900k 关小核,8c16t 情况下,编译到部分阶段开始摆了,使用率不到 30%,全程状态只有不到 40%时间可以高使用率的。
    debuggeeker
        27
    debuggeeker  
       10 天前
    @lisxour 工具链什么意思,安卓这边的编译用的是 jdk ,gradle ,同一个项目配置一样的,没有版本差异。同版本 Linux 上的 jdk gradle 更好吗
    HangoX
        28
    HangoX  
       9 天前
    @debuggeeker 你这个属于另外的情况,是编译到一个模块的时候,只能并发那么多导致的,是你项目设置的问题。
    我说的是需要机器给 16 线程出力的时候,window 总是给到的只有 14 的力量,就是占用率在会掉到 80%多。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5503 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:26 · PVG 11:26 · LAX 20:26 · JFK 23:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.