V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
momowei
V2EX  ›  Go 编程语言

go 的内存优势在部分场景比想象中多

  •  
  •   momowei · 2 天前 · 10593 次点击

    不是吵架帖子,但经常看 go 和 java 比较的时候,经常有人说,go 节省点的内存跟程序员相比根本不值得一提,我越想越觉得不对劲,对于最常规的 crud 来说,不得不说 java 确实比 go 还是要一些的,不过事实是 java 或者 php 程序员转 go 其实狠快根本没那么难,而且现在环境下程序员不一定就很贵了。

    go 和 java 我自己都在写,一般来说对于不差钱的国企和政府以及企业市场,java 确实是最适合的,但是我也自己做一些小产品和项目给一些小公司,我能感觉到 java 和 go 对你拿单的成本影响是很大的,比如我有一个订票(城际定制商务车业务)小程序,有时候是我自己提供云服务器,我不得不说物理机的内存确实狠便宜,可是云服务器的内存真的很贵,新用户还不明显,老用户续费狠明显,在一台 2 核 4g 的云服务器上,我一般自建数据库和 redis,然后再配合 go 的应用,因为可能面对好几个客户,会有一些自定义需求,所以部署个五六个是狠轻松的,因为每个应用的访问量并不大,但如果是 java 是很难这样子搞得,这样给了自己很大得利润空间以及拿单成本。

    说了这么多,我只能说 go 其实更适合个人开发者和成本敏感型得小团队,因为一般这样团队,都自己写程序,最大得成本就是云服务得开支了,最后再说一句云服务器得内存,cpu,宽带真得很贵,动不动类似 spring 全家桶那样得架构真得狠费机器。

    138 条回复    2024-10-18 16:35:15 +08:00
    1  2  
    zhouhu
        101
    zhouhu  
       1 天前
    主要是 spring boot ,还有就是 java object header 占用。
    前者市面上应该有很多代替品
    后者的话,JEP 450: Compact Object Headers (Experimental) 发布了会有重大改善
    fox0001
        102
    fox0001  
       1 天前
    golang ,对我来说,一直只是玩玩,直到被 grpc 震惊……
    kalayygl001
        103
    kalayygl001  
       1 天前
    给某师上了台 Intel 8380h*2/512G / 960ssd *2 和 intel 4310*2/256G/4TB*4 , 跑的 java 服务崩了
    居然说服务器和系统问题,
    这 java………………
    james122333
        104
    james122333  
       1 天前 via Android
    @zhjunjun

    我 就算你不写 框架也会写
    两条路 第一反射 第二代码生成
    代码生成比较麻烦 代码量也变多了
    james122333
        105
    james122333  
       1 天前 via Android
    回到正题不管什么语言全自写才是最省内存和 cpu 资源的
    Charlie17Li
        106
    Charlie17Li  
       1 天前 via iPhone
    既然 golang 这么好,有没有推荐的 golang web 开发实践之类的呢,java 转 golang web ,写后端处理 err 有点难受,以及参数检验也好原始
    jeesk
        107
    jeesk  
       1 天前 via Android
    @zhjunjun 你不用, 不代表别人不用。
    jeesk
        108
    jeesk  
       23 小时 57 分钟前 via Android
    随便说一个场景,golang 里面要上传超大文件, 文件达到 几个 g ,如果网络传输超快, 这是时候如果你再写入一个新文件,耗时增加一倍, 如果将临时文件 rename , 上传时间减少一半,对于有性能有 kpi 的项目, 标准库里面没有暴露临时文件字段,这个时候反射就很有作用了。 当然你也可以自己上传的解析。
    lesismal
        109
    lesismal  
       22 小时 59 分钟前   ❤️ 1
    @fox0001 grpc 有啥可震惊的... 主要就是靠着谷歌爹的光环, 另外就是郭德纲那句: 同行(thrift 那些垃圾)衬托

    grpc 除了跨语言优势, 性能不值一提:
    https://colobu.com/2022/07/31/2022-rpc-frameworks-benchmarks/
    james122333
        110
    james122333  
       22 小时 35 分钟前
    @lesismal

    我用标准 rpc 确实不错 应该算是标准库偏少数拿的出手的 不过还是因为我不想用复杂的东西
    lemayi
        111
    lemayi  
       16 小时 23 分钟前
    @newaccount 不会还觉得写 go 多复杂吧
    bv
        112
    bv  
       15 小时 2 分钟前
    @jeesk #108 这倒是个不错的思路,我看了下,用不到反射,只需要简单的断言就可以了。

    func saveFile(upload *multipart.FileHeader, dst string) error {
    srcFile, err := upload.Open()
    if err != nil {
    return err
    }
    defer srcFile.Close()

    if file, ok := srcFile.(*os.File); ok {
    return os.Rename(file.Name(), dst)
    }

    dstFile, err := os.Create(dst)
    if err != nil {
    return err
    }
    defer dstFile.Close()

    _, err = io.Copy(dstFile, srcFile)

    return err
    }
    jeesk
        113
    jeesk  
       14 小时 43 分钟前
    @bv 这样不好, 2 次复制了. 最好一次第一次直接解析临时文件, 然后 rename, copy 对于磁盘的性能占用很大,特别上 g 的大文件.
    guanzhangzhang
        114
    guanzhangzhang  
       14 小时 38 分钟前
    @jeesk #113 🤔file.seek 也可以吧,直接 seek 写,全部接收完了 rename
    bv
        115
    bv  
       14 小时 36 分钟前
    @jeesk #113 注意看:如果断言是 *os.FIle 就 os.Rename() 。不是才走 io.Copy 。
    jeesk
        116
    jeesk  
       14 小时 32 分钟前
    @bv
    @guanzhangzhang

    看到了, 断言好像是必要的。

    最开始我记得也是自己 rename, 发现不太行, 才用的反射。
    jeesk
        117
    jeesk  
       14 小时 12 分钟前
    @bv 这里直接使用 rename 是不行的。 我自己手动设置了临时的缓存目录一样不行。 后面拿到真是的文件对象才能 rename 。
    bv
        118
    bv  
       13 小时 49 分钟前
    @jeesk #117 不明白你为何不行,至少我这边自测是成功的。
    同时也测试出了 rename 存在一个限制:在 Linux 中,不同分区/分区格式不同时,会报错:rename <src> <dest>: invalid cross-device link ,这并不是上面的代码使用方式不对,只是系统低层的限制。rename 出错最好不要直接返回错误,而是要退化到 io.Copy 去兜底。
    jeesk
        119
    jeesk  
       13 小时 39 分钟前
    @bv cross-device link 错误后,直接拿到文件去 rename 即可.
    zhjunjun
        120
    zhjunjun  
       13 小时 38 分钟前
    go 里面尽量少用反射,本身和 java 的机制也不一样,没必要拿 java 那套来写 go ,这样本末倒置。
    SilenceLL
        121
    SilenceLL  
       13 小时 22 分钟前
    @helone #83 还真不一定,晋升总得搞点数据,没办法。提升 XX 就是最好的数据
    249239432
        122
    249239432  
       13 小时 19 分钟前
    @chendy 我的云服务器,1 核 1G ,一个 java 的 web 实例,一个 java 的端口转发程序,redis 、svn 、mysql ,你说呢?
    caola
        123
    caola  
       13 小时 7 分钟前
    @lambdaq #9 我一台 1c1g 的一样跑几个项目,redis 用的是 kvrocks 替代,内存是绰绰有余
    @momowei 推荐你也把 redis 换成 kvrocks ,你就发现 4G 内存还可以多跑几个项目
    bv
        124
    bv  
       13 小时 3 分钟前
    @jeesk #119 就是 rename 才报的 invalid cross-device link 错误,不明白你说 “cross-device link 错误后,直接拿到文件去 rename 即可.”要表达什么意思?

    如果你有什么解决思路,不妨分享一下代码,或者详细的描述一下思路。
    standchan
        125
    standchan  
       12 小时 58 分钟前
    @newaccount #5 语言不是壁垒,很多 javaer 看几天就可以上手了,还有 gpt 的加持,没什么太大难度。但是 go 实打实的节省 cpu / mem 确实香很多
    wysnxzm
        126
    wysnxzm  
       12 小时 51 分钟前
    @Narcissu5 #67 他们不听的,什么空间换时间时间换空间反正内存占用低就行了
    newaccount
        127
    newaccount  
       12 小时 34 分钟前
    不同的语言有不同的适用环境,没事儿一个个的非得 at 我愣是死夸这东西啥都好是不是脑子有问题?
    但凡是个脑子清楚的正常开发,做个三五年之后什么语言不是三五天上手随便写?
    但能够理解这个语言主导的开发思想和框架生态,没个三五年沉浸进去就别妄称会用
    一门语言是不是值得学习,一个重要标准就是它是否能够拓宽你的视野,进而转变你的开发思路
    OP 原本已经说的非常好了,go 适合的是个人开发者和成本敏感的小团队
    假设配置三个后端,至少得配一个前端和一个设计,五个人的情况下,考虑的主要是人员变动后,是否更方便的补齐
    招 java ,整体环境非常成熟,谁来写都是那一套,大差不差的,进来培训一下业务就可以上手了
    go ?市场上人靠谱的人难找,又没有什么成熟的标准,几乎一个项目一个玩法,光让人适应这个团队的编码方法就得额外多花时间
    等一年半载的培训好了,人家又觉得本事大了看不上小庙,那公司就是出钱培训是吧
    对于一个能正常盈利的中小企业来说,服务器不值钱,而且对于 IT 团队是有一个正常的试错成本的,基本上每年十万以内的异常消费都不用跟上级额外说明,怕出错只会让人畏手畏脚不敢试错,最终造成更大的问题
    monmon
        128
    monmon  
       11 小时 36 分钟前
    @Charlie17Li 做项目看一看看这些,
    go-zero https://go-zero.dev/ 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
    Kratos https://go-kratos.dev/docs/ 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。
    GoFrame https://goframe.org/display/gf 一款模块化、低耦合设计的开发框架,包含了常用的基础组件和开发工具,既可以作为完整的业务项目框架使用也可以作为独立的组件库使用。
    gin-vue-admin https://www.gin-vue-admin.com/ 是一款基于 GIN+VUE+ElementPlus 开发的全栈基础开发平台
    如果是做项目这几个都可以看看,都比较完善,社区活跃度也都不错,基础语法基本不用看,一边猜一边学就够用,其他问题 #127 newaccount 总结的很好了
    byte10
        129
    byte10  
       10 小时 10 分钟前
    @importmeta 老哥,那个 Bun 能不能把 nodejs 的项目打包成一个可执行文件呢?打包后程序体积大不大?比如一个简单的 koa 服务
    importmeta
        130
    importmeta  
       9 小时 49 分钟前
    @byte10 Webpack 可以, Bun 没试过, 方式参考 https://juejin.cn/post/7065724860688760862
    importmeta
        131
    importmeta  
       9 小时 47 分钟前
    @importmeta 虽然用 Webpack 打包了, 但是 Bun 可以运行打包之后的文件.
    dabingbing
        132
    dabingbing  
       9 小时 40 分钟前
    常年用 PHP-FPM ,用过一段时间 GO ,打包二进制后,爽歪歪,后来用了 PHP 的 workman 之类的非 php-fpm 后,重新拿起 PHP ,反正对我来用哪个都行,关键是开发出来的产品能不能挣到钱才是关键,所以现在关注的是快,所以我选择 PHP
    sagaxu
        133
    sagaxu  
       9 小时 21 分钟前
    @helone 32# 大厂 KPI 项目多如牛毛,中小厂 team 或个人也会自己设定目标做性能优化,但是往往止步于提高了多少性能,却很少提到减少了多少台服务器。国内服务器数量最多的公司是阿里,集团主流开发语言仍然是 Java 。

    @wupher Spring 成就了 Java 的开发效率,但也是启动慢,吃内存大户的推手。很多人对 Java 项目的印象就是打包几百 M,启动几十秒甚至分钟级。其实现在轻量级 Java 框架,小项目秒启动,100M 内存也能跑,早不是动辄大几百 M 上 G 内存。不过还是得承认,对初学者来说,Java 很容易按照网上的资料写出笨重的项目来,好多人甚至吐槽阿里的 AI 写的 Go 也是 Java 那味儿。
    novohit
        134
    novohit  
       8 小时 54 分钟前
    @helone 这只是一方面吧,还有一方面是 KPI 问题
    bbbblue
        135
    bbbblue  
       8 小时 50 分钟前
    说得好 不过自己项目有前后端直接 nextjs+supbabase 一把全梭了 公司项目公司用啥就用啥
    lesismal
        136
    lesismal  
       8 小时 1 分钟前
    @james122333 标准库 rpc 算是中规中举,各方面一般。也可以看下 #109 我贴的连接,测评是鸟窝老师做的,最快的那个应该算是我的 arpc ,更快,使用简单,而且功能丰富得很,可以支持的业务场景也更多,包括推送、游戏、IM ,普通 rpc 是很难做这些场景的,欢迎体验
    lesismal
        137
    lesismal  
       7 小时 53 分钟前
    @james122333 arpc 的例子,可能比标准库 rpc 用起来还要简单些吧,像 net/http 一样简单:
    https://github.com/lesismal/arpc?tab=readme-ov-file#quick-start
    lesismal
        138
    lesismal  
       7 小时 46 分钟前
    @helone #32 字节的 http 和 rpc 的 benchmark 数据是自称的,第三方测评跟他们官方的数据不太一致,最好是把测试条件对齐、自己跑下实际代码看看真实数据。另外,他们这些基于自家 netpoll 的库,在一些场景消耗不太正常,甚至用空间换时间、内存消耗比其他框架高的多、稳定性也存疑(我压测的时候就遇到过多次卡死、但其他框架都没事),如果生产上允许比较高的 cpu 那可能影响业务稳定性,如果只允许有限的连接数,那每个节点又没法省更多(跟其他 go 框架相比)
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1817 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:22 · PVG 00:22 · LAX 09:22 · JFK 12:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.