3

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

 3 years ago
source link: https://www.v2ex.com/t/735027
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

V2EX  ›  Go

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

  gzdaijie · 26 天前 · 7873 次点击

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

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

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

项目地址:high-performance-go

84 条回复    2020-12-15 12:42:44 +08:00
kevinwan

kevinwan   26 天前 via iPhone

gzdaijie

gzdaijie   26 天前

@kevinwan 活捉大佬一枚,关注了~
youngce

youngce   26 天前

支持!!!!看过博主的 geecache 系列,太棒了
oxromantic

oxromantic   26 天前

减少体积那个。。。upx 就不要拿出来提了吧,另外都用 go 了,也不会在乎细微的体积差别了
gzdaijie

gzdaijie   26 天前 via Android

@oxromantic 因为在公司会做一些插件小工具,10MB 压缩到 3MB,7MB 的差异对我来说,是至关重要的,不知道有啥更好的压缩体积的方法?
gzdaijie

gzdaijie   26 天前 via Android

@youngce 笔芯~
Mitt

Mitt   26 天前

@gzdaijie #6 要是 windows 这种用户类的软件可能 upx 有点用,不然可能会起反效果,upx 的解压过程在内存里,没必要为了省那点硬盘浪费内存
wzw

wzw   26 天前 via iPhone

每一篇,都值得看,谢谢
gzdaijie

gzdaijie   26 天前 via Android

@Mitt 感谢建议,我可以再去探索下各种场景的实践。我自己服务器部署的服务是不会用的,但是一些插件的场景,考虑到设备空间,或是 hook 的场景,套在常用命令前执行,体积对性能上是有影响的。
wzw

wzw   26 天前 via iPhone

减少编译体积,会影响性能吗
SjwNo1

SjwNo1   26 天前

收藏了 慢慢看
cabing

cabing   26 天前

棒棒哒,建议可以完善下 go 的并发工具。参考 juc
mouzhiyang

mouzhiyang   26 天前

CrazyBoyFeng

CrazyBoyFeng   26 天前

减少体积这条现在意义不大,-s 和-w 参数能省的空间并不多。比较有效的就是 upx,但在启动时解压缩会多消耗 cpu 和内存。
不知道 golang 官方有没有出动态链接编译的计划。搭配发行 runtime environment 或者发行模块化动态链接库。做到一库多用。只有这样才能节省硬盘和内存。不过如此一来,就需要处理依赖问题。
现在这样静态编译挺不适合低端硬件的嵌入式编程的。ram 和 rom 都较小的情况下,一库多用才是经济合理的。
gzdaijie

gzdaijie   26 天前 via Android

@wzw upx 带壳压缩,优点是仍可以直接运行,缺点是,运行时动态解压。不过实际应用过程中,解压感觉几乎是无影响的,所以对体积比较敏感的场合还是推荐用的,比如嵌入式设备。体积会影响加载和网络传输时间。通过编译选项减小体积是能提高性能的。
oxromantic

oxromantic   26 天前

@gzdaijie 嵌入设备必须使用支持压缩的文件系统吧,这样 upx 也没必要了
gzdaijie

gzdaijie   26 天前 via Android

@oxromantic,嗯,这种是不需要的。但文件系统不是必须,嵌入式设备种类很多,家用路由器是,树莓派是,体积庞大的基站其实也是。不过因为体积和内存,Go 在这块的应用场景还非常有限,要求稍微高一点,就只能用 C 了。
CrazyBoyFeng

CrazyBoyFeng   26 天前

@CrazyBoyFeng 我查到 go 已经有动态链接编译的模式了,出来的 helloworld 只有 22kb,但是因为 go 几乎没有二进制依赖库管理机制,至今极难面向用户推行这种模式。
gzdaijie

gzdaijie   26 天前 via Android

@cabing 非常感谢你的建议,才刚刚开始写不久,通过讨论慢慢地拓宽视野。
gzdaijie

gzdaijie   26 天前 via Android

@CrazyBoyFeng 对的,动态链接是支持的,比如 cgo 编程,链接 C 库,类似于胶水。
CrazyBoyFeng

CrazyBoyFeng   26 天前

不过虽然动态编译 helloworld 只有 16kb,但是动态链接编译 go 标准库有 32mb 大小。如果应用少的话,可能还不如静态编译应用省空间。
http://z-rui.github.io/post/2016/07/golang-shared-library/
不知道有没有分模块编译动态库的方式,类似 python 那样。
raaaaaar

raaaaaar   26 天前 via Android   ❤️ 1

催一个 7 天
darksword21

darksword21   26 天前   ❤️ 1

🐎️住!
ShiningMage

ShiningMage   26 天前   ❤️ 1

yixinlove

yixinlove   26 天前   ❤️ 1

jmyz0455

jmyz0455   26 天前

请问,go 写 web 好写吗?撸 crud 快吗?
gzdaijie

gzdaijie   26 天前 via Android

@jmyz0455 复杂的应用上,go 的生态比起 java 还是差挺多。简单网站区别不大。
yhzwy

yhzwy   26 天前

go 一般是做什么领域的比较多 业务开发方向的
gzdaijie

gzdaijie   26 天前 via Android

@yhzwy 可以多关注 go 比较知名的项目,微服务,系统编程(容器,数据库,文件系统等),以及一些性能工具会比较多。
shoaly

shoaly   26 天前

@gzdaijie 感谢老哥给的 压缩方案, 之前一直在找没找到.... 美滋滋
lewinlan

lewinlan   26 天前 via Android

朋友,你的代码有不止一个问题啊。
比如 for 和 range 的性能比较那一段,二者根本就是不同的代码,当然性能有差距了。
建议再好好理解一下 range 的原理
Ehco1996

Ehco1996   26 天前 via iPhone

支持 我是从 geeorm 入坑的哈哈

希望能讲讲网络相关的优化
比如 buffer poll,splice 特性之类的
Takamine

Takamine   26 天前 via Android

支持,我记得还有 Python 的坑,楼主别忘了。:doge:
gzdaijie

gzdaijie   26 天前 via Android

@lewinlan 哈哈,感谢你的建议。工作中的一些总结和尝试,大部分是自己的理解,错误在所难免,不过写之前也在尽可能多地参考。在讨论中慢慢完善和修正吧。早上刚合入了一个 PR 。
gzdaijie

gzdaijie   26 天前 via Android

@Ehco1996 嗯,网络异步 IO,多路复用这一块的确是比较某意思的。写法上接近 C 语言编程了。
gzdaijie

gzdaijie   26 天前 via Android

@Takamine 啊,这。。。过于细心了。
gzdaijie

gzdaijie   26 天前 via Android

@shoaly 哈哈,有场景用上了是最大的支持了~
gzdaijie

gzdaijie   26 天前 via Android

这个贴的批评和建议价值都很大。期待各位大大的 issue 和 PR 。今晚打算把 upx 这部分讨论,还有把有个老哥发起的静态链接的贴的内容传送门到博客中去,留个参考。
eudore

eudore   26 天前   ❤️ 1

建议加上 sync.Pool 和 unsafe 两篇,都是常用的性能优化方法。
cnwlei

cnwlei   26 天前   ❤️ 1

正在学 go,等我入门了再看 doge
hbolive

hbolive   26 天前   ❤️ 1

p1gd0g

p1gd0g   26 天前   ❤️ 1

Remember that "microbenchmark" is a synonym for "lie". There is no semantic difference between the two.
Shawdon

Shawdon   26 天前   ❤️ 1

zhoudaiyu

zhoudaiyu   26 天前   ❤️ 1

虽然现在还看不懂,但是先收藏🐱
dany813

dany813   26 天前   ❤️ 1

gzdaijie

gzdaijie   26 天前 via Android

@eudore 感谢建议,记下了。unsafe 数据库 bbolt 用得蛮多的,用来做内存映射和数据格式转换,有限减少内存拷贝。
teaaa

teaaa   26 天前   ❤️ 1

gzdaijie

gzdaijie   26 天前 via Android

@p1gd0g 哈哈,这个观点有意思。在 benchmark 之外,找到一些理论支撑会好一些。不过表象本身也有一定的作用。
Yoock

Yoock   26 天前   ❤️ 1

已经在看了
zhuzhibin

zhuzhibin   26 天前 via iPhone   ❤️ 1

7 天俺可以学会不
Caratpine

Caratpine   26 天前   ❤️ 1

支持一下,很给力
b00tyhunt3r

b00tyhunt3r   26 天前   ❤️ 1

f6x

f6x   26 天前   ❤️ 1

文风简洁. +1
ai277014717

ai277014717   26 天前   ❤️ 1

不错正在写 go 收藏一下
gzdaijie

gzdaijie   26 天前

@zhuzhibin 哈哈,每天 70 行代码,你可以的。借楼感谢下各位小伙伴。7 天系列的一开始也有很多 bug,感谢各位小伙伴在评论区的各种质疑和贡献,现在除了极少数没解决的 bug,其他部分的代码相对是比较精炼了。新项目也会积极收集大家的批评和建议,慢慢完善的。
gzdaijie

gzdaijie   26 天前

没来得及一一回复的小伙伴,发送感谢来表达我的谢意了。关于 benchmark 表象下的性能问题,突然想到最近在 BiliBili 看的王德峰老师的《资本论》,提到马克思的哲学革命,剥离范畴进行现象还原,蛮有意思的,比如两个高级灵长类动物在肉搏,不同范畴下就会有不同的事实表述,警匪之战,或是两人斗殴,或是其他,还可以顺便吸一口华子。
f6x

f6x   26 天前   ❤️ 1

@gzdaijie 页面留言失败, 这里发给你吧. <如何退出协程>一文

* 2.1 代码应为 `done := make(chan bool, 1)`
* 部分场景可用 sync.WaitGroup 简化代码
Donne

Donne   26 天前   ❤️ 1

wellhope

wellhope   26 天前 via iPhone   ❤️ 1

👍🏻👍🏻已看了不少了,很受用
pythonee

pythonee   26 天前   ❤️ 1

meiyoumingzi6

meiyoumingzi6   26 天前 via iPhone   ❤️ 1

eudore

eudore   26 天前   ❤️ 1

@gzdaijie sync.Pool 不算么,很重要的性能优化方法,列表这些感觉蛮基础的。还有一些其他高性能的技巧,例如:slice 和 map 预分配、io.Reader 接口、tcmalooc 对其、for 访问树减少递归的函数调用
gzdaijie

gzdaijie   26 天前 via Android

@eudore,感谢,都记下了,逐步加进去~ sync.Pool 减少对象创建,减轻 GC 压力,在网络通信中是非常有用的。
gzdaijie

gzdaijie   26 天前

@f6x 代码错误 fixed,WaitGroup 考虑单独写一下~
warjiang

warjiang   26 天前   ❤️ 1

@gzdaijie 抓住大佬两枚,哈哈
mango88

mango88   25 天前   ❤️ 1

lucky4

lucky4   25 天前   ❤️ 1

支持一下,最近在看 the way to go,等我看完了再学习你的文章
yyzq007

yyzq007   25 天前   ❤️ 1

wohenlanya

wohenlanya   25 天前   ❤️ 1

barbery

barbery   25 天前   ❤️ 1

不错 有意思 关注一下
gakkiismywife1

gakkiismywife1   25 天前   ❤️ 1

zackkson1991

zackkson1991   25 天前   ❤️ 1

支持一下。
freefcw

freefcw   25 天前   ❤️ 1

不错不错,虽然没空写 go 了,还是要支持支持
lewinlan

lewinlan   25 天前 via Android   ❤️ 1

@gzdaijie 我也从你这里学到了一些东西,共勉共勉~
nicoley

nicoley   25 天前   ❤️ 1

好东西啊!现在正在学 Go
foursking

foursking   25 天前   ❤️ 1

已关注,看了几章都是干货
zhangzhang

zhangzhang   25 天前   ❤️ 1

zhengdai1990

zhengdai1990   25 天前   ❤️ 1

kevinwan

kevinwan   25 天前 via iPhone

github go 月榜里 7days-golang 和 go-zero 上下铺🤝
ptnan

ptnan   25 天前

是大佬, 大佬的类 gin 和类 xcache 我都学习过, 在面试的时候提供了很大的帮助
gzdaijie

gzdaijie   25 天前

@kevinwan 大佬的是生产项目,我的是 Demo 项目,含金量完全不一样的,致敬。
gzdaijie

gzdaijie   25 天前

@ptnan 哈哈,面试能提供帮助,这就很开心了。开源的一些设计的确是能够让人耳目一新的,我在学习这些开源项目之前,很多算法、名词听都没听说过。
kevinwan

kevinwan   25 天前 via iPhone

@gzdaijie 大佬别谦虚,能给用户带来价值就是好项目

关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2971 人在线   最高记录 5298   ·  

创意工作者们的社区

World is powered by solitude

VERSION: 3.9.8.5 · 30ms · UTC 06:12 · PVG 14:12 · LAX 22:12 · JFK 01:12
♥ Do have faith in what you're doing.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK