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

你们的项目启动时间是几秒?

  •  3
     
  •   szq8014 · 2021-06-22 14:24:31 +08:00 · 12718 次点击
    这是一个创建于 1249 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在手头负责的单体项目是 15-20 秒左右, 有点影响自己的写代码节奏。。加一些启动参数能达到 10-12 秒,感觉变化不大,如果能在 5 秒内启动该多好。
    之前待过的公司也都是单体 Java 项目,启动速度慢的能达到 1 分钟, 大家现在手头的项目启动速度都是什么级别的呢? 有没有影响到你们的思维节奏?

    第 1 条附言  ·  2021-06-23 15:31:47 +08:00

    补充一下,有人可能之前没想过去优化 Spring 项目的启动速度。 至少有几个启动参数是效果非常好的, 比如

    -XX:TieredStopAtLevel=1 -Xmx1024M -Xms1024m -noverify 
    

    jvm-args.png

    参考:

    https://stackoverflow.com/a/49663075

    https://github.com/dsyer/spring-boot-startup-bench

    101 条回复    2022-07-08 21:13:39 +08:00
    1  2  
    yitingbai
        1
    yitingbai  
       2021-06-22 14:27:10 +08:00
    用到的东西多了启动肯定慢啊, 如果有条件可以把项目分成几个模块, 分别开发分别调试
    szq8014
        2
    szq8014  
    OP
       2021-06-22 14:37:09 +08:00
    @yitingbai 现在也在纠结这个事,不知道服务化拆分后收益大不大
    XiLingHost
        3
    XiLingHost  
       2021-06-22 14:37:18 +08:00   ❤️ 1
    拆成不同的组件,写好 CI,提交的时候自动 rolling update,这样就方便了
    pmispig
        4
    pmispig  
       2021-06-22 14:39:40 +08:00
    快的 60 秒,慢的 180 秒。。。你这 15 秒超神
    peyppicp
        5
    peyppicp  
       2021-06-22 14:41:10 +08:00
    golang 项目,2s
    cslive
        6
    cslive  
       2021-06-22 14:42:19 +08:00
    配置垃圾,2 分钟起不起来
    szq8014
        7
    szq8014  
    OP
       2021-06-22 14:44:07 +08:00
    @pmispig 那开发时间岂不是有很多浪费在了启动上?
    kwanzaa
        8
    kwanzaa  
       2021-06-22 14:44:53 +08:00
    故意放慢速度来打印 log 提供仪式感,不然裸载 2s 。
    ericgui
        9
    ericgui  
       2021-06-22 14:47:03 +08:00
    @szq8014 不大
    zen1
        10
    zen1  
       2021-06-22 14:55:17 +08:00
    本地最少 2min+
    wwwz
        11
    wwwz  
       2021-06-22 14:55:18 +08:00
    慢啊,java 用 jrebel 热部署,有的时候还是需要重启
    Tink
        12
    Tink  
       2021-06-22 14:57:59 +08:00 via Android   ❤️ 1
    纠结这个感觉意义不大啊
    zzzmh
        13
    zzzmh  
       2021-06-22 15:00:59 +08:00   ❤️ 2
    影响思路具体如何影响,是每次写完调试,重启项目,慢?
    感觉我不会那么频繁遇到需要重启的情况,写完一套逻辑,重启一次,一天也就十来次。
    另外解决思路很简单啊,自己买个 amd 5800h 芯的本子,刷 linux 系统,不管重启还是编译都快到赏心悦目
    chenqh
        14
    chenqh  
       2021-06-22 15:02:22 +08:00
    @zzzmh 10 来此重启,我 2 分钟就用完了
    pkoukk
        15
    pkoukk  
       2021-06-22 15:06:38 +08:00
    2s 左右?
    现在写 tdd,新代码 cover 的差不多了才会启项目搞集成测试,启不了几次
    wr516516
        16
    wr516516  
       2021-06-22 15:11:38 +08:00
    好奇你加的什么启动参数
    szq8014
        17
    szq8014  
    OP
       2021-06-22 15:11:48 +08:00
    @kwanzaa 优秀
    szq8014
        18
    szq8014  
    OP
       2021-06-22 15:12:43 +08:00
    @wr516516 网上能搜到,是 SpringBoot 启动优化的

    具体参数是 `-XX:TieredStopAtLevel=1 -Xmx1024M -Xms1024m -noverify `
    reeco
        19
    reeco  
       2021-06-22 15:13:05 +08:00 via iPhone
    60w 行代码,编译 5 分钟,启动 15 分钟
    Mogamigawa
        20
    Mogamigawa  
       2021-06-22 15:15:35 +08:00 via iPhone
    35 分钟
    wxw752
        21
    wxw752  
       2021-06-22 15:23:56 +08:00   ❤️ 9
    带薪启动,不要在意速度。正好可以去喝一杯咖啡
    janda
        22
    janda  
       2021-06-22 15:39:39 +08:00
    junit 单元测试
    szq8014
        23
    szq8014  
    OP
       2021-06-22 15:41:41 +08:00
    @reeco 厉害了..
    NUT
        24
    NUT  
       2021-06-22 15:46:09 +08:00
    这个问题核心是在于,如何快速 debug 吧。

    想好逻辑,用 TDD 减少 debug 次数,debug 很费时间,我认为如何降低 debug 次数,比考虑项目启动优化,要有意义。 俗称 脑子跑代码。。。

    各种设计原则用一用,什么单一原则,开闭等等。

    如果对项目启动有要求,差那几秒没啥意义,现在都是容器化时代了,蓝绿红黑,随便搞搞就解决了。
    dream10201
        25
    dream10201  
       2021-06-22 15:51:01 +08:00
    在主程序的第一句:print("启动成功")
    byte10
        26
    byte10  
       2021-06-22 15:52:53 +08:00
    @reeco 牛到不行。我们那些狮山项目 I7-10 代表压 U 启动 45S,m1 启动 30 秒,M1 是真的无脑强。
    @peyppicp (⊙o⊙)… go 怎么那么厉害。java 是真的烂,go,nodejs,python,这些玩意是真的舒服。随时写,随时跑
    hsuvee
        27
    hsuvee  
       2021-06-22 16:01:47 +08:00
    Java 曾有一个 20 分钟
    yuancoder
        28
    yuancoder  
       2021-06-22 16:02:10 +08:00
    php 一秒内
    szq8014
        29
    szq8014  
    OP
       2021-06-22 16:14:11 +08:00
    @ericgui 哈哈哈哈。我看你发了一个屎山的,看来经历过
    yeqizhang
        30
    yeqizhang  
       2021-06-22 16:17:06 +08:00 via Android
    启动几分钟,编译十分钟……
    chenqh
        31
    chenqh  
       2021-06-22 16:19:44 +08:00
    @byte10 golang 是启动快,但是写的时候想死
    xloger
        32
    xloger  
       2021-06-22 16:23:59 +08:00
    Android 项目,冷启动要 2 分多钟,打一个 release 包要 6 分钟。时常吐槽说等编译的时间已经超过我 debug 的时间了。耗时分析有一半时间是在 kotlin 编译上,为此还看了下别人的优化方案: https://juejin.cn/post/6854573211548385294
    看完放弃自己优化的念头了。我需要公司配个更好的 CPU ......
    Leonard
        33
    Leonard  
       2021-06-22 16:35:25 +08:00
    公司抠,电脑配置不行,慢就慢呗,反正我按点下班,慢浪费的也不是我的时间
    otakustay
        34
    otakustay  
       2021-06-22 16:48:30 +08:00
    冷启动 3 分钟左右,有缓存的热启动 5 秒左右,热更新几乎秒完成
    HDMItoDP
        35
    HDMItoDP  
       2021-06-22 16:55:18 +08:00
    300 多秒
    Junzhou
        36
    Junzhou  
       2021-06-22 17:05:00 +08:00
    i7-7700 14s,M1 8s
    joyhub2140
        37
    joyhub2140  
       2021-06-22 17:18:28 +08:00
    这个没有固定指标的吧?

    同一个项目,有人 10 核 5G 主频,64G 内存随便开。
    有人双核赛扬 8g 内存卡半天。。。
    sprite82
        38
    sprite82  
       2021-06-22 17:29:24 +08:00
    i5 7500 16G 内存 启动 15s 左右,但是我一天启动次数不超过 10 次
    polo3584
        39
    polo3584  
       2021-06-22 17:36:50 +08:00
    最长的时候 500 多秒,后面通过一些注释终于降到了 150 秒内。
    Greatshu
        40
    Greatshu  
       2021-06-22 17:37:23 +08:00
    10 分钟,刚好够去一次厕所
    xingjue
        41
    xingjue  
       2021-06-22 17:39:12 +08:00
    go 的编译速度快
    bghtyu
        42
    bghtyu  
       2021-06-22 17:51:00 +08:00
    go 启动很快,但是编译也挺慢的
    zhanggg
        43
    zhanggg  
       2021-06-22 17:51:03 +08:00
    单体还好,最多几分钟,全新起一套完整服务要超 24 小时
    hapiman
        44
    hapiman  
       2021-06-22 18:01:30 +08:00
    用 Go,5 秒内启动
    crclz
        45
    crclz  
       2021-06-22 18:31:58 +08:00
    C#( Asp.Net )启动速度非常快,1s
    gtx990
        46
    gtx990  
       2021-06-22 18:35:28 +08:00 via Android
    Java guice
    启动倒是很快,几秒就行
    编译,docker 打包要几分钟
    inhzus
        47
    inhzus  
       2021-06-22 18:38:39 +08:00 via iPhone   ❤️ 1
    项目本地启动不起来,环境上部署一下五分钟过去了。调试绝大多数靠单测,定位问题用 arthas
    ysicing
        48
    ysicing  
       2021-06-22 18:42:09 +08:00
    Go 启动 2s,编译 10s 左右
    heheda11
        49
    heheda11  
       2021-06-22 19:55:44 +08:00
    Python fastApi 0.1s ~
    lixingjun
        50
    lixingjun  
       2021-06-22 20:20:58 +08:00
    nodejs 1.5 秒,不过这样比较似乎意义不大
    ConfusedBiscuit
        51
    ConfusedBiscuit  
       2021-06-22 20:48:19 +08:00
    巨无霸 Java 项目,IDEA 导入一次 20 分钟+,启动一次 5 分钟+,打包 1.5GB
    3dwelcome
        52
    3dwelcome  
       2021-06-22 20:49:58 +08:00   ❤️ 1
    @xloger "打一个 release 包要 6 分钟"

    apk 打包有一些时间是用在压缩 asset 上,apk 的本质是 zip,每个文件都是单独压缩的,如果文件没有变,可以直接复用上一次压缩结果(前提是要保留上一次的压缩包作为对比对象)

    这样速度就很快了。
    akira
        53
    akira  
       2021-06-22 22:28:12 +08:00
    java 的项目啊。。分钟级别都是能接受的
    HunterPan
        54
    HunterPan  
       2021-06-22 22:36:50 +08:00 via iPhone
    1 分钟内可接受,自己的项目一般 30s 内
    wdlth
        55
    wdlth  
       2021-06-22 22:45:56 +08:00
    20 秒左右吧
    lzfnb
        56
    lzfnb  
       2021-06-23 01:08:41 +08:00   ❤️ 1
    要那么快干啥,启动时间越长划水时间越久
    imbushuo
        57
    imbushuo  
       2021-06-23 05:46:09 +08:00
    warmup 两小时……
    eudore
        58
    eudore  
       2021-06-23 08:43:37 +08:00
    go 直接启动 1 秒,编译启动 5 秒内。
    zmxnv123
        59
    zmxnv123  
       2021-06-23 08:47:21 +08:00 via iPhone
    春节的时候做主站的项目,编译十分钟启动十分钟。
    privil
        60
    privil  
       2021-06-23 09:05:52 +08:00
    java 项目从 20 s 到 120s,话说用 openj9 启动会快很多。
    free9fw
        61
    free9fw  
       2021-06-23 09:08:21 +08:00
    30w 行代码大概 85s
    szq8014
        62
    szq8014  
    OP
       2021-06-23 09:17:04 +08:00
    @privil 还有这种事? 有时间试一下
    szq8014
        63
    szq8014  
    OP
       2021-06-23 09:18:31 +08:00
    @gtx990 我们这里没法推广 guice,大家都不会用
    xingguang
        64
    xingguang  
       2021-06-23 09:23:30 +08:00
    18 年的时候接收的一个项目还用的 webpack1,启动一次五分钟,在忍了一年以后我升级了,启动速度不到一分钟
    myd
        65
    myd  
       2021-06-23 09:28:18 +08:00
    php 不需要启动
    janxin
        66
    janxin  
       2021-06-23 09:39:21 +08:00
    听上去是个 Spring 项目...
    yazinnnn
        67
    yazinnnn  
       2021-06-23 10:03:28 +08:00
    从打印第一行日志到处理第一个请求 1.5s,vertx+kotlin,不过这有什么意义呢....

    用 spring 的话肯定慢阿,因为 spring 慢就喷 java 烂未免也太狭隘了
    Warder
        68
    Warder  
       2021-06-23 10:05:12 +08:00
    @xingguang 能忍一年,也是个 nb
    Tinyang
        69
    Tinyang  
       2021-06-23 10:11:37 +08:00
    3 分钟
    wangsongyan
        70
    wangsongyan  
       2021-06-23 10:31:30 +08:00
    @zzzmh #13 请问 linux 系统有推荐的吗?
    chainchan
        71
    chainchan  
       2021-06-23 10:54:15 +08:00
    20 分钟
    byte10
        72
    byte10  
       2021-06-23 11:05:04 +08:00
    @chenqh 我觉得 nodejs 写起来方便,写的外包项目,写的小工具,go 也不错啊,可以编译成可执行文件,也是很舒服的,写点小工具方便,安卓,macos,ios 那些都可以直接跑
    wr516516
        73
    wr516516  
       2021-06-23 11:10:12 +08:00
    @szq8014 多谢分享,又学到之前不了解的知识
    Cbdy
        74
    Cbdy  
       2021-06-23 11:15:48 +08:00 via Android
    秒级
    zzzmh
        75
    zzzmh  
       2021-06-23 11:30:47 +08:00
    @wangsongyan 看水平,我是半吊子,我就省心用 ubuntu,因为新版 amd 的核显驱动老出问题,就 ubuntu+5.10 内核最省心。。。否则我可能会首选 deepin,因为 deepin 带的微信什么的至少是调试好的,可以免去我自己调试。。。。然后如果是大佬,推荐 arch debian fedora manjaro,这种我只敢在虚拟机里玩,笔记本玩过一次 manjaro,从入门到重装系统,只花了一个月
    HannibaI
        76
    HannibaI  
       2021-06-23 12:38:55 +08:00
    150w 行 C++,编译 5 分钟,启动 4-5s 吧
    tomoya92
        77
    tomoya92  
       2021-06-23 13:15:08 +08:00 via iPhone
    @pkoukk 什么是 tdd
    xiluo
        78
    xiluo  
       2021-06-23 13:24:17 +08:00
    尝试换到 Graalvm 试试呢,启动速度提高 50 倍
    l4ever
        79
    l4ever  
       2021-06-23 13:31:13 +08:00
    python flask
    <1s
    thetbw
        80
    thetbw  
       2021-06-23 14:55:00 +08:00
    大概 27 分钟吧
    thetbw
        81
    thetbw  
       2021-06-23 14:56:08 +08:00
    @thetbw 补充一下 ,java,spring,之前在处理依赖的时候堆栈溢出过几次
    x940727
        82
    x940727  
       2021-06-23 15:02:27 +08:00
    @byte10 Go 的编译期没有任何优化的,而且 Go 的语法对编译器更友好……Java 也有不优化的编译器,AOT 的速度其实也勉勉强强,主要有反射会影响静态编译。
    szq8014
        83
    szq8014  
    OP
       2021-06-23 15:19:17 +08:00
    @byte10 Java 也可以随时写随时跑, 想写启动快的 Java 可以尝试 quarkus, 你要有勇于离开 Spring 的魄力才行, 当然现在 spring native 也在迭代中。
    chihiro2014
        84
    chihiro2014  
       2021-06-23 16:12:34 +08:00
    140s-200s 左右?
    wanguorui123
        85
    wanguorui123  
       2021-06-23 16:19:45 +08:00
    秒起
    3dwelcome
        86
    3dwelcome  
       2021-06-23 16:40:40 +08:00
    我其实挺好奇 chrome 开发组是怎么缩短启动时间的,我自己编译浏览器,一般启动至少要 5 分钟以上。

    因为 C++必须把无数.obj 文件链接成一个 exe,对于 chrome 这种巨无霸体量,这一步特别的费时间。

    然后我搜了一下谷歌,还真有 chrome.dll 编译优化,blog.llvm.org/2018/01/improving-link-time-on-windows-with.html

    诀窍就是换编译器,一开始是 MSVC,编译 chrome.dll 用时 507.17s 。换了 CLang 之后 34.76s ,10 倍速度提升。
    284716337
        87
    284716337  
       2021-06-23 16:44:11 +08:00
    前台 war,在服务器上大概 5 分钟,😂
    FlexGap
        88
    FlexGap  
       2021-06-23 19:36:42 +08:00
    golang 的项目,大概七八秒钟
    MithrilCookie
        89
    MithrilCookie  
       2021-06-23 19:46:00 +08:00
    借楼问一下,生产环境 PASS(公司自建 PASS)下容器的启动速度远远比不上开发机(本人用 m1 mac),这种情况正常吗? SpringBoot 的单体应用,本地十几秒,生产上两三分钟(容器是 4 核 8g 的),感觉跟树莓派是一个级别的
    ylsc633
        90
    ylsc633  
       2021-06-23 19:51:37 +08:00
    作为一个刚刚从 Golang 转到 java 的开发者来说

    java 一启动.. 真的慢

    问题是 java 项目是个新写的项目 代码估计就几万行吧
    ychost
        91
    ychost  
       2021-06-23 21:09:12 +08:00
    5 分钟
    mreasonyang
        92
    mreasonyang  
       2021-06-24 02:02:44 +08:00 via iPhone
    怎么定义启动速度快慢呢?是以 JVM 完成启动和初始编译为准,还是以服务 ready 可供调用为准?如果是前者,那可以考虑楼上的建议。如果是后者,那么只要是用了连接池的项目都不会快,同时这种情况下与长尾的建连相比,JVM 相关的启动耗时可以忽略不计了
    Ailoli
        93
    Ailoli  
       2021-06-24 08:42:22 +08:00
    vue 1 分钟+-
    johnniang
        94
    johnniang  
       2021-06-24 08:53:55 +08:00 via Android
    yizmaoaa
        95
    yizmaoaa  
       2021-06-24 09:43:37 +08:00
    Quarkus 2 秒。楼上有人提 Spring Native 。应用场景不一样。Graalvm 打包后的 native-image 是秒起,但是打包速度是很慢的。用都没用过的东西就别瞎推荐了-
    telan233
        96
    telan233  
       2021-06-24 10:33:19 +08:00
    java 编译+启动 4 分钟
    samin
        97
    samin  
       2021-06-24 14:25:18 +08:00
    @pkoukk 请问贵司是多大规模的厂子 ? 我们团队最近也在想着进军 TDD,就拿这调试来说就已经是个非常大的优势,交流下经验
    laobodslr
        98
    laobodslr  
       2021-06-25 18:59:09 +08:00
    200S 左右
    starxg
        99
    starxg  
       2021-06-29 18:43:26 +08:00   ❤️ 1
    启动时加上-Dspring.main.lazy-initialization=true 或者在配置文件里加上这句话。

    开启全局懒加载,启动速度非常快!

    但是快也是有代价的,参考这里: https://blog.csdn.net/peterwanghao/article/details/95617046
    Dreamerwwr
        100
    Dreamerwwr  
       2022-07-08 12:23:10 +08:00
    @polo3584 用的什么注释?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5273 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 07:07 · PVG 15:07 · LAX 23:07 · JFK 02:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.