微信搜索【脑补炸鱼】关注这条炸肝炸鱼。本文GitHubgithub.com/eddycjy/blog已收录,附有我的系列文章、资料和开源Go书籍。大家好,我是炸鱼。在Go1.17发布后,我们惊喜地发现Go语言再次得到了优化。编译器改进后,性能提升了5%左右,没有破坏性的变化,保证了向前兼容。他做了什么?好像没看到有人提过。为此,今天剑鱼就带大家解读一下这两个新提案:《Proposal: Register-based Go calling convention》《Proposal: Create an undefined internal calling convention》本文将根据提案进行解读和拆解。毕竟,分享新知识必须从官方信息作为事实依据。背景在以前的Go版本中,Go的调用约定很简单并且几乎是跨平台通用的。原因是选择了基于Plan9ABI的栈调用约定,即在栈上传递函数的参数和返回值。这里提到了Plan9和ABI,这是两个关键概念:Plan9:Go语言使用的汇编程序,RobPike是贝尔实验室的猛男。ABI:ApplicationBinaryInterface(应用程序二进制接口),ABI包含了应用程序在操作系统下运行时必须遵守的编程约定(例如:二进制接口)。该方案的优缺点如下:优点:实施简单,降低实施成本。缺点:在性能方面付出了很多代价。按照我的理解,在Go语言的初级阶段,简单的先实现,再运行。也有道理,性能不是TOP1的要求。Go1.17优化了什么是调用约定。在新版本的优化中,提到了调用约定(callingconvention)的概念,它指的是调用者和被调用者之间对函数调用的共识约定。这些共识包括:函数参数、返回值、参数传递顺序、传递方式等。只有双方都必须遵守这个约定,程序的功能才能正常运行。如果不遵循,该功能将不起作用。什么是优化从Go1.17开始,Go内部ABI规范(在Go函数之间使用)将从基于堆栈的函数参数和结果传递更改为基于寄存器的函数参数和结果传递。本次修改涉及项较多,优化持续进行。原本预计在Go1.16实现,后来推迟到Go1.17。目前已实现对amd64和arm64架构的支持。Go1.18还有很??多支持会继续完成,具体进度可以看issues#40724。Go1.17发行说明中如何指定性能,以一组具有代表性的Go包和程序为基准。官方数据显示,围棋程序的运行性能提升了5%左右。Go编译的二进制文件大小减少了大约2%。从民间数据来看,是在推特上看到@Achille表示从Go1.15.7升级到Go1.17后显示的。Go1.17在大规模数据处理系统上的升级产生了惊人的效果,来看看他的真实数据吧。CPU、Malloc调用时间减少了大约15%:RSS大小更接近堆大小:从1.6GB到1GB。结合官方和私人数据,优化效果清晰有效。有兴趣的朋友也可以自己测试一下。综上所述,在Go1.17新版??本中,我们只需要简单的升级Go版本,就可以获得一定的性能优化,非常不错。从以前的基于栈的函数参数和结果传递方式,到Go1.17~Go1.18基于寄存器的函数参数和结果传递方式,Go语言一步步变好!你怎么认为?如有任何问题,欢迎在评论区反馈交流。最好的关系是相互成就。您的好评是创作炸鱼最大的动力。感谢您的支持。文章持续更新中,微信搜索【脑补炸鱼】即可阅读,回复【000】一线大厂面试算法方案和资料我都准备好了;本文已收录在GitHubgithub.com/eddycjy/blog,欢迎Star提醒。
