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

欢迎入坑我的新项目: Go 语言高性能编程

  •  1
     
  •   gzdaijie ·
    geektutu · 2020-12-13 19:02:51 +08:00 · 10329 次点击
    这是一个创建于 1442 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在实现 7days-golang 这个项目过程中,接触到了很多开源项目的源码,里面有很多优雅的实现,结合最近工作中的一些经历,启动了「 Go 语言高性能编程」这个开源电子书项目。Go 语言优秀的电子书其实蛮多的,比如 Go 语言原本,Go 语言实现与设计等,可能对大部分童鞋来说过于深奥了。「 Go 语言高性能编程」这个项目聚焦于编程实践,同时会有少量的原理分析,比较适合希望无痛进阶的初学者~

    一个月利用碎片时间写了十篇文章,还顺便改造了下我的 hexo 博客模板,融合了 gitbook 的排版方式。

    感兴趣的童鞋可以关注一波,这个项目也是一起兴起,比较肝,提交时间基本在凌晨了。七天用 Go 从零实现这个项目也会继续维护的,不过这个项目特别需要整块的时间,最近整块时间实在太少,新坑一直没填上。

    项目地址:high-performance-go

    84 条回复    2020-12-15 12:42:44 +08:00
    kevinwan
        1
    kevinwan  
       2020-12-13 19:04:24 +08:00 via iPhone
    支持
    gzdaijie
        2
    gzdaijie  
    OP
       2020-12-13 19:05:24 +08:00
    @kevinwan 活捉大佬一枚,关注了~
    kevinwan
        3
    kevinwan  
       2020-12-13 19:14:31 +08:00
    @gzdaijie 共建 Go 生态🤝
    youngce
        4
    youngce  
       2020-12-13 19:42:02 +08:00
    支持!!!!看过博主的 geecache 系列,太棒了
    oxromantic
        5
    oxromantic  
       2020-12-13 20:04:41 +08:00
    减少体积那个。。。upx 就不要拿出来提了吧,另外都用 go 了,也不会在乎细微的体积差别了
    gzdaijie
        6
    gzdaijie  
    OP
       2020-12-13 20:10:42 +08:00 via Android
    @oxromantic 因为在公司会做一些插件小工具,10MB 压缩到 3MB,7MB 的差异对我来说,是至关重要的,不知道有啥更好的压缩体积的方法?
    gzdaijie
        7
    gzdaijie  
    OP
       2020-12-13 20:11:26 +08:00 via Android
    @youngce 笔芯~
    Mitt
        8
    Mitt  
       2020-12-13 20:22:35 +08:00
    @gzdaijie #6 要是 windows 这种用户类的软件可能 upx 有点用,不然可能会起反效果,upx 的解压过程在内存里,没必要为了省那点硬盘浪费内存
    wzw
        9
    wzw  
       2020-12-13 20:27:25 +08:00 via iPhone
    每一篇,都值得看,谢谢
    gzdaijie
        10
    gzdaijie  
    OP
       2020-12-13 20:32:34 +08:00 via Android
    @Mitt 感谢建议,我可以再去探索下各种场景的实践。我自己服务器部署的服务是不会用的,但是一些插件的场景,考虑到设备空间,或是 hook 的场景,套在常用命令前执行,体积对性能上是有影响的。
    wzw
        11
    wzw  
       2020-12-13 21:11:53 +08:00 via iPhone
    减少编译体积,会影响性能吗
    SjwNo1
        12
    SjwNo1  
       2020-12-13 21:14:26 +08:00
    收藏了 慢慢看
    cabing
        13
    cabing  
       2020-12-13 21:22:52 +08:00
    棒棒哒,建议可以完善下 go 的并发工具。参考 juc
    mouzhiyang
        14
    mouzhiyang  
       2020-12-13 21:25:30 +08:00
    支持
    CrazyBoyFeng
        15
    CrazyBoyFeng  
       2020-12-13 21:30:08 +08:00
    减少体积这条现在意义不大,-s 和-w 参数能省的空间并不多。比较有效的就是 upx,但在启动时解压缩会多消耗 cpu 和内存。
    不知道 golang 官方有没有出动态链接编译的计划。搭配发行 runtime environment 或者发行模块化动态链接库。做到一库多用。只有这样才能节省硬盘和内存。不过如此一来,就需要处理依赖问题。
    现在这样静态编译挺不适合低端硬件的嵌入式编程的。ram 和 rom 都较小的情况下,一库多用才是经济合理的。
    gzdaijie
        16
    gzdaijie  
    OP
       2020-12-13 21:33:59 +08:00 via Android
    @wzw upx 带壳压缩,优点是仍可以直接运行,缺点是,运行时动态解压。不过实际应用过程中,解压感觉几乎是无影响的,所以对体积比较敏感的场合还是推荐用的,比如嵌入式设备。体积会影响加载和网络传输时间。通过编译选项减小体积是能提高性能的。
    oxromantic
        17
    oxromantic  
       2020-12-13 21:38:14 +08:00
    @gzdaijie 嵌入设备必须使用支持压缩的文件系统吧,这样 upx 也没必要了
    gzdaijie
        18
    gzdaijie  
    OP
       2020-12-13 21:45:20 +08:00 via Android
    @oxromantic,嗯,这种是不需要的。但文件系统不是必须,嵌入式设备种类很多,家用路由器是,树莓派是,体积庞大的基站其实也是。不过因为体积和内存,Go 在这块的应用场景还非常有限,要求稍微高一点,就只能用 C 了。
    CrazyBoyFeng
        19
    CrazyBoyFeng  
       2020-12-13 21:47:53 +08:00
    @CrazyBoyFeng 我查到 go 已经有动态链接编译的模式了,出来的 helloworld 只有 22kb,但是因为 go 几乎没有二进制依赖库管理机制,至今极难面向用户推行这种模式。
    gzdaijie
        20
    gzdaijie  
    OP
       2020-12-13 21:48:29 +08:00 via Android
    @cabing 非常感谢你的建议,才刚刚开始写不久,通过讨论慢慢地拓宽视野。
    gzdaijie
        21
    gzdaijie  
    OP
       2020-12-13 21:53:28 +08:00 via Android
    @CrazyBoyFeng 对的,动态链接是支持的,比如 cgo 编程,链接 C 库,类似于胶水。
    CrazyBoyFeng
        22
    CrazyBoyFeng  
       2020-12-13 22:03:54 +08:00
    不过虽然动态编译 helloworld 只有 16kb,但是动态链接编译 go 标准库有 32mb 大小。如果应用少的话,可能还不如静态编译应用省空间。
    http://z-rui.github.io/post/2016/07/golang-shared-library/
    不知道有没有分模块编译动态库的方式,类似 python 那样。
    raaaaaar
        23
    raaaaaar  
       2020-12-13 22:15:14 +08:00 via Android   ❤️ 1
    催一个 7 天
    darksword21
        24
    darksword21  
       2020-12-13 22:27:05 +08:00   ❤️ 1
    🐎️住!
    ShiningMage
        25
    ShiningMage  
       2020-12-13 22:38:00 +08:00   ❤️ 1
    标记一下
    yixinlove
        26
    yixinlove  
       2020-12-13 23:09:15 +08:00   ❤️ 1
    标记一下
    jmyz0455
        27
    jmyz0455  
       2020-12-13 23:57:35 +08:00
    请问,go 写 web 好写吗?撸 crud 快吗?
    gzdaijie
        28
    gzdaijie  
    OP
       2020-12-14 00:14:57 +08:00 via Android
    @jmyz0455 复杂的应用上,go 的生态比起 java 还是差挺多。简单网站区别不大。
    yhzwy
        29
    yhzwy  
       2020-12-14 00:25:57 +08:00
    go 一般是做什么领域的比较多 业务开发方向的
    gzdaijie
        30
    gzdaijie  
    OP
       2020-12-14 00:35:04 +08:00 via Android
    @yhzwy 可以多关注 go 比较知名的项目,微服务,系统编程(容器,数据库,文件系统等),以及一些性能工具会比较多。
    shoaly
        31
    shoaly  
       2020-12-14 01:03:39 +08:00
    @gzdaijie 感谢老哥给的 压缩方案, 之前一直在找没找到.... 美滋滋
    lewinlan
        32
    lewinlan  
       2020-12-14 02:00:08 +08:00 via Android
    朋友,你的代码有不止一个问题啊。
    比如 for 和 range 的性能比较那一段,二者根本就是不同的代码,当然性能有差距了。
    建议再好好理解一下 range 的原理
    Ehco1996
        33
    Ehco1996  
       2020-12-14 07:29:53 +08:00 via iPhone
    支持 我是从 geeorm 入坑的哈哈

    希望能讲讲网络相关的优化
    比如 buffer poll,splice 特性之类的
    Takamine
        34
    Takamine  
       2020-12-14 08:01:57 +08:00 via Android
    支持,我记得还有 Python 的坑,楼主别忘了。:doge:
    gzdaijie
        35
    gzdaijie  
    OP
       2020-12-14 08:29:07 +08:00 via Android
    @lewinlan 哈哈,感谢你的建议。工作中的一些总结和尝试,大部分是自己的理解,错误在所难免,不过写之前也在尽可能多地参考。在讨论中慢慢完善和修正吧。早上刚合入了一个 PR 。
    gzdaijie
        36
    gzdaijie  
    OP
       2020-12-14 08:30:21 +08:00 via Android
    @Ehco1996 嗯,网络异步 IO,多路复用这一块的确是比较某意思的。写法上接近 C 语言编程了。
    gzdaijie
        37
    gzdaijie  
    OP
       2020-12-14 08:31:23 +08:00 via Android
    @Takamine 啊,这。。。过于细心了。
    gzdaijie
        38
    gzdaijie  
    OP
       2020-12-14 08:33:46 +08:00 via Android
    @shoaly 哈哈,有场景用上了是最大的支持了~
    gzdaijie
        39
    gzdaijie  
    OP
       2020-12-14 08:47:01 +08:00 via Android
    这个贴的批评和建议价值都很大。期待各位大大的 issue 和 PR 。今晚打算把 upx 这部分讨论,还有把有个老哥发起的静态链接的贴的内容传送门到博客中去,留个参考。
    eudore
        40
    eudore  
       2020-12-14 08:51:38 +08:00   ❤️ 1
    建议加上 sync.Pool 和 unsafe 两篇,都是常用的性能优化方法。
    cnwlei
        41
    cnwlei  
       2020-12-14 08:59:45 +08:00   ❤️ 1
    正在学 go,等我入门了再看 doge
    hbolive
        42
    hbolive  
       2020-12-14 08:59:54 +08:00   ❤️ 1
    支持!
    p1gd0g
        43
    p1gd0g  
       2020-12-14 09:13:02 +08:00   ❤️ 1
    Remember that "microbenchmark" is a synonym for "lie". There is no semantic difference between the two.
    Shawdon
        44
    Shawdon  
       2020-12-14 09:16:54 +08:00   ❤️ 1
    姿瓷
    zhoudaiyu
        45
    zhoudaiyu  
       2020-12-14 09:20:35 +08:00   ❤️ 1
    虽然现在还看不懂,但是先收藏🐱
    dany813
        46
    dany813  
       2020-12-14 09:29:33 +08:00   ❤️ 1
    gzdaijie
        47
    gzdaijie  
    OP
       2020-12-14 09:46:45 +08:00 via Android
    @eudore 感谢建议,记下了。unsafe 数据库 bbolt 用得蛮多的,用来做内存映射和数据格式转换,有限减少内存拷贝。
    teaaa
        48
    teaaa  
       2020-12-14 09:48:01 +08:00   ❤️ 1
    支持:)
    gzdaijie
        49
    gzdaijie  
    OP
       2020-12-14 09:48:38 +08:00 via Android
    @p1gd0g 哈哈,这个观点有意思。在 benchmark 之外,找到一些理论支撑会好一些。不过表象本身也有一定的作用。
    Yoock
        50
    Yoock  
       2020-12-14 10:04:36 +08:00   ❤️ 1
    已经在看了
    zhuzhibin
        51
    zhuzhibin  
       2020-12-14 10:04:48 +08:00 via iPhone   ❤️ 1
    7 天俺可以学会不
    Caratpine
        52
    Caratpine  
       2020-12-14 10:25:42 +08:00   ❤️ 1
    支持一下,很给力
    b00tyhunt3r
        53
    b00tyhunt3r  
       2020-12-14 10:40:02 +08:00   ❤️ 1
    f6x
        54
    f6x  
       2020-12-14 10:42:43 +08:00   ❤️ 1
    文风简洁. +1
    ai277014717
        55
    ai277014717  
       2020-12-14 10:48:26 +08:00   ❤️ 1
    不错正在写 go 收藏一下
    gzdaijie
        56
    gzdaijie  
    OP
       2020-12-14 11:14:50 +08:00
    @zhuzhibin 哈哈,每天 70 行代码,你可以的。借楼感谢下各位小伙伴。7 天系列的一开始也有很多 bug,感谢各位小伙伴在评论区的各种质疑和贡献,现在除了极少数没解决的 bug,其他部分的代码相对是比较精炼了。新项目也会积极收集大家的批评和建议,慢慢完善的。
    gzdaijie
        57
    gzdaijie  
    OP
       2020-12-14 11:21:43 +08:00
    没来得及一一回复的小伙伴,发送感谢来表达我的谢意了。关于 benchmark 表象下的性能问题,突然想到最近在 BiliBili 看的王德峰老师的《资本论》,提到马克思的哲学革命,剥离范畴进行现象还原,蛮有意思的,比如两个高级灵长类动物在肉搏,不同范畴下就会有不同的事实表述,警匪之战,或是两人斗殴,或是其他,还可以顺便吸一口华子。
    f6x
        58
    f6x  
       2020-12-14 12:08:28 +08:00   ❤️ 1
    @gzdaijie 页面留言失败, 这里发给你吧. <如何退出协程>一文

    * 2.1 代码应为 `done := make(chan bool, 1)`
    * 部分场景可用 sync.WaitGroup 简化代码
    Donne
        59
    Donne  
       2020-12-14 12:11:58 +08:00   ❤️ 1
    持续关注
    wellhope
        60
    wellhope  
       2020-12-14 12:40:51 +08:00 via iPhone   ❤️ 1
    👍🏻👍🏻已看了不少了,很受用
    pythonee
        61
    pythonee  
       2020-12-14 12:47:30 +08:00   ❤️ 1
    感谢分享
    meiyoumingzi6
        62
    meiyoumingzi6  
       2020-12-14 13:46:45 +08:00 via iPhone   ❤️ 1
    支持一下
    eudore
        63
    eudore  
       2020-12-14 13:55:44 +08:00   ❤️ 1
    @gzdaijie sync.Pool 不算么,很重要的性能优化方法,列表这些感觉蛮基础的。还有一些其他高性能的技巧,例如:slice 和 map 预分配、io.Reader 接口、tcmalooc 对其、for 访问树减少递归的函数调用
    gzdaijie
        64
    gzdaijie  
    OP
       2020-12-14 14:01:07 +08:00 via Android
    @eudore,感谢,都记下了,逐步加进去~ sync.Pool 减少对象创建,减轻 GC 压力,在网络通信中是非常有用的。
    gzdaijie
        65
    gzdaijie  
    OP
       2020-12-14 14:06:06 +08:00
    @f6x 代码错误 fixed,WaitGroup 考虑单独写一下~
    warjiang
        66
    warjiang  
       2020-12-14 14:12:26 +08:00   ❤️ 1
    @gzdaijie 抓住大佬两枚,哈哈
    mango88
        67
    mango88  
       2020-12-14 14:13:19 +08:00   ❤️ 1
    支持一下
    lucky4
        68
    lucky4  
       2020-12-14 14:26:07 +08:00   ❤️ 1
    支持一下,最近在看 the way to go,等我看完了再学习你的文章
    yyzq007
        69
    yyzq007  
       2020-12-14 14:50:59 +08:00   ❤️ 1
    支持支持
    wohenlanya
        70
    wohenlanya  
       2020-12-14 15:04:35 +08:00   ❤️ 1
    标记下
    barbery
        71
    barbery  
       2020-12-14 15:27:00 +08:00   ❤️ 1
    不错 有意思 关注一下
    gakkiismywife1
        72
    gakkiismywife1  
       2020-12-14 16:51:55 +08:00   ❤️ 1
    标记下
    zackkson1991
        73
    zackkson1991  
       2020-12-14 16:59:43 +08:00   ❤️ 1
    支持一下。
    freefcw
        74
    freefcw  
       2020-12-14 17:42:27 +08:00   ❤️ 1
    不错不错,虽然没空写 go 了,还是要支持支持
    lewinlan
        75
    lewinlan  
       2020-12-14 19:08:35 +08:00 via Android   ❤️ 1
    @gzdaijie 我也从你这里学到了一些东西,共勉共勉~
    nicoley
        76
    nicoley  
       2020-12-14 19:30:32 +08:00   ❤️ 1
    好东西啊!现在正在学 Go
    foursking
        77
    foursking  
       2020-12-14 19:42:38 +08:00   ❤️ 1
    已关注,看了几章都是干货
    zhangzhang
        78
    zhangzhang  
       2020-12-14 20:01:24 +08:00   ❤️ 1
    干货满满
    zhengdai1990
        79
    zhengdai1990  
       2020-12-14 20:03:21 +08:00   ❤️ 1
    膜拜大佬
    kevinwan
        80
    kevinwan  
       2020-12-15 08:02:55 +08:00 via iPhone
    github go 月榜里 7days-golang 和 go-zero 上下铺🤝
    ptnan
        81
    ptnan  
       2020-12-15 11:10:35 +08:00
    是大佬, 大佬的类 gin 和类 xcache 我都学习过, 在面试的时候提供了很大的帮助
    gzdaijie
        82
    gzdaijie  
    OP
       2020-12-15 11:10:49 +08:00
    @kevinwan 大佬的是生产项目,我的是 Demo 项目,含金量完全不一样的,致敬。
    gzdaijie
        83
    gzdaijie  
    OP
       2020-12-15 11:13:00 +08:00
    @ptnan 哈哈,面试能提供帮助,这就很开心了。开源的一些设计的确是能够让人耳目一新的,我在学习这些开源项目之前,很多算法、名词听都没听说过。
    kevinwan
        84
    kevinwan  
       2020-12-15 12:42:44 +08:00 via iPhone
    @gzdaijie 大佬别谦虚,能给用户带来价值就是好项目
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 12:42 · PVG 20:42 · LAX 04:42 · JFK 07:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.