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

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

  •  
  •   momowei · 1 天前 · 9566 次点击

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

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

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

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

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

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

    我用标准 rpc 确实不错 应该算是标准库偏少数拿的出手的 不过还是因为我不想用复杂的东西
    lemayi
        111
    lemayi  
       5 小时 18 分钟前
    @newaccount 不会还觉得写 go 多复杂吧
    bv
        112
    bv  
       3 小时 57 分钟前
    @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  
       3 小时 38 分钟前
    @bv 这样不好, 2 次复制了. 最好一次第一次直接解析临时文件, 然后 rename, copy 对于磁盘的性能占用很大,特别上 g 的大文件.
    guanzhangzhang
        114
    guanzhangzhang  
       3 小时 33 分钟前
    @jeesk #113 🤔file.seek 也可以吧,直接 seek 写,全部接收完了 rename
    bv
        115
    bv  
       3 小时 32 分钟前
    @jeesk #113 注意看:如果断言是 *os.FIle 就 os.Rename() 。不是才走 io.Copy 。
    jeesk
        116
    jeesk  
       3 小时 27 分钟前
    @bv
    @guanzhangzhang

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

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

    如果你有什么解决思路,不妨分享一下代码,或者详细的描述一下思路。
    standchan
        125
    standchan  
       1 小时 53 分钟前
    @newaccount #5 语言不是壁垒,很多 javaer 看几天就可以上手了,还有 gpt 的加持,没什么太大难度。但是 go 实打实的节省 cpu / mem 确实香很多
    wysnxzm
        126
    wysnxzm  
       1 小时 47 分钟前
    @Narcissu5 #67 他们不听的,什么空间换时间时间换空间反正内存占用低就行了
    newaccount
        127
    newaccount  
       1 小时 29 分钟前
    不同的语言有不同的适用环境,没事儿一个个的非得 at 我愣是死夸这东西啥都好是不是脑子有问题?
    但凡是个脑子清楚的正常开发,做个三五年之后什么语言不是三五天上手随便写?
    但能够理解这个语言主导的开发思想和框架生态,没个三五年沉浸进去就别妄称会用
    一门语言是不是值得学习,一个重要标准就是它是否能够拓宽你的视野,进而转变你的开发思路
    OP 原本已经说的非常好了,go 适合的是个人开发者和成本敏感的小团队
    假设配置三个后端,至少得配一个前端和一个设计,五个人的情况下,考虑的主要是人员变动后,是否更方便的补齐
    招 java ,整体环境非常成熟,谁来写都是那一套,大差不差的,进来培训一下业务就可以上手了
    go ?市场上人靠谱的人难找,又没有什么成熟的标准,几乎一个项目一个玩法,光让人适应这个团队的编码方法就得额外多花时间
    等一年半载的培训好了,人家又觉得本事大了看不上小庙,那公司就是出钱培训是吧
    对于一个能正常盈利的中小企业来说,服务器不值钱,而且对于 IT 团队是有一个正常的试错成本的,基本上每年十万以内的异常消费都不用跟上级额外说明,怕出错只会让人畏手畏脚不敢试错,最终造成更大的问题
    monmon
        128
    monmon  
       31 分钟前
    @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 总结的很好了
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:17 · PVG 13:17 · LAX 22:17 · JFK 01:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.