大家好,Golang 1.15 Outlook:新的链接器,更小的可执行包大小,更高的性能相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于Golang 1.15 Outlook:新的链接器,更小的可执行包大小,更高的性能和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
概述
自Golang 1.0发布以来,Go团队一直在改进每个版本中的工具和标准库,但对于语言的变化始终持保守态度。自1.0 版本以来,团队的重点一直是稳定性和简单性。 Golang 的向后兼容性承诺确保用Golang 1.x 编写的程序将继续正常运行并在Go 中保持不变。该程序在1.x版本下将继续正常运行,但较新的版本运行速度会更快。
在即将发布的Golang 1.15版本中,对语言规范的改动基本上是最小的。主要改进包括工具、编译器性能和标准库。
Golang 1.15 于5 月1 日进入功能冻结,保持正常的第六个月,Go 团队计划在8 月1 日发布最终版本。
Golang的开发模型与大多数开源语言完全不同。该语言是由Google 设计的,大多数核心开发人员都在Google 工作。 Golang 语言是根据BSD 风格的许可证获得许可的,其开发是公开进行的,并在golang-dev 邮件列表上进行了广泛讨论。在GitHub 存储库问题中提出并讨论更改或新功能,并通过Gerrit 审查代码更改。
全新的链接器
Golang 1.15最大的变化是完全重写的链接器。新连接器由核心开发商Austin.Clements于2019年9月设计并开始开发。新连接器将带来三项改进:
并行编译:可以并行化。编译开始支持CPU并行完成,但链接步骤必须在构建结束时以串行模式完成。此外,Go 工具会缓存编译器结果。
避免使用字符串来改进关键数据结构。当前的链接器使用由字符串索引的大型符号表。新设计通过使用符号编号技术尽可能避免使用字符串。
避免一次将所有输入目标文件加载到内存中。新的链接器具有更好的内存占用,并且可以用更少的内存处理大型程序。 (当前链接器有超过20% 的时间花在GC 上)。
较小的二进制文件
一些相关的改进可以减少使用Golang 1.15 的可执行文件的大小。根据开发者的测试,新的链接器删除了大量未使用的代码,从而将程序可执行文件大小从Golang 1.14中的8.2MB减少到1.15中的3.9MB。对于更实用的程序,生成的二进制可执行文件的大小最多可以减少22%。
执行器大小的改进主要是由于消除了新链接器对中未使用的代码以及一些有针对性的改进,例如CL 230544,它减少了可执行文件中包含的堆栈和寄存器映射的数量。 Golang 的垃圾收集器(GC) 使用这些映射来确定哪些对象仍然存在,但现在仅在调用时需要它们,而不是在每条指令上都需要它们。通过这一改进,Golang 二进制文件的大小减少了5.7%;它还大大加快了编译和链接的速度。
由于Go 能够在运行时检查类型,因此Golang 二进制文件包含大量类型信息。将符号的类型信息转换为接口,并且输出中仅包含其类型信息。 CL 231397 更改将典型hello-world 程序的大小减少了7.2%。
对于二进制大小还有其他一些小改进,例如CL 228111,如果仅使用TLS 客户端和服务器代码,则可以避免在输出中同时包含TLS 客户端和服务器代码,从而将TLS 拨号hello world 程序大小减少3.2%。
性能改进
Go 1.15 引入了许多小的性能改进,但其中两个值得注意的改进来自多产的非Google 贡献者Josh Bleecher Snyder。 CL 216401 避免在将小整数转换为接口值时分配内存,从而使编译时的汇编时间缩短2%。转换为接口值就像其他语言中的“拳击”。这种优化本质上类似于Python 的小型整数缓存,尽管由于静态类型,它在Go 中发生的频率要低得多。
Snyder 的第二个更改是编译器和运行时内部的CL 226367,它允许编译器使用更多的x86 寄存器来进行垃圾收集器的写屏障调用。当GC 与用户代码同时运行时,Go 使用写屏障(有点像锁)来维护堆上数据的完整性。这减少了二进制文件的数量并将编译时间缩短了1%。
通过重新设计内存分配器的mcentral数据结构来减少锁争用,大大提高了大块内存分配的吞吐量。对于12KB 或更大的块,新代码的速度提高了一倍多。
工具和端口
Golang 模块系统(Go 的依赖管理系统)在Go 1.11 中首次引入,并在1.13 中添加了对模块镜像和代理的支持。 1.15 版本添加了对错误回退代理的支持,以便在下载模块源代码时第一个代理失败时,go 工具可以回退到备用代理。使用新的“|” GOMODCACHE 环境变量中的分隔符用于指定备用代理计算机。
另外,linux/arm64移植已经升级为“一流移植”,因此如果linux/arm64版本没有完成,Golang版本将不会发布。 Go 团队提供官方二进制文件和安装文档。 Linux 64 位Arm 现在至少与32 位Arm 一样重要,32 位Arm 已经是一流的移植。
在Windows 上,Go 1.15 现在默认使用地址空间布局随机化(ASLR)生成可执行文件。 ASLR 使用与位置无关的代码在启动时将地址随机分配到各个数据区域,使攻击者更难以预测目标地址并创建内存损坏漏洞。
添加了标准库
Go的标准库很大而且相当稳定;在Go 1.15 中,仅添加了相对较小的功能。
标准库的测试包非常简单,而Go的哲学是避免使用特定领域的语言编写测试和断言,而只编写开发人员已经知道的普通Go。但核心开发人员发现创建临时目录很有用,并批准添加TempDir() 方法,该方法自动为当前测试创建临时目录,并在测试完成后自动删除它。
net/url 包添加了一个新的URL.Redacted() 方法,该方法以字符串形式返回URL,但将密码部分替换为XXXXX。例如,诸如ernamepassword@example.com 之类的URL 不再在浏览器中使用,但在脚本和工具中仍然很常见。遵循RFC 3986 的准则,Redacted() 可用于更安全地记录URL,以便: 之后的部分不会呈现为明文。
添加了time/tzdata 包以允许将时区数据库的静态副本嵌入到可执行文件中。由于它向可执行文件添加了约800K,因此可以通过导入time/tzdata 包或使用timetzdata 构建标记来编译它。嵌入式数据库可以使对时区数据库的访问在某些系统(尤其是Windows)上更加一致和可靠,并且在Docker 容器和Go Playgrounds 等虚拟化环境中也很有用。
总结
Golang 使用GitHub issues 来跟踪所有错误和功能请求,因此您可以查看Go 1.15 里程碑中已解决问题的列表,以获取更详细的发布信息。
Golang 1.15的最终版本将在2个月后发布。目前可以使用gotip工具轻松搭建1.15测试环境进行测试。 beta二进制包将于下个月的6月1日发布,届时您就可以使用beta版本了。
标题:Golang 1.15 Outlook:新的链接器,更小的可执行包大小,更高的性能
链接:https://www.ltthb.com/news/xydt/132951.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
这个 Golang 1.15 的新链接器听起来很酷!我希望它能真正缩减可执行的大小,这样就能更快地部署游戏。
有13位网友表示赞同!
要是游戏加载速度更快了就好了!我实在烦透了那些长时间加载的游戏。
有20位网友表示赞同!
性能提高?我最喜欢的游戏类型是第一人称射击游戏,那更需要流畅的体验!
有5位网友表示赞同!
我希望这个新的链接器能对所有游戏都有所帮助,而不是仅仅局限于特定类型的游戏。
有14位网友表示赞同!
这听起来很像一个潜在的游戏改变者!
有17位网友表示赞同!
如果可执行包更小了,那意味着移动平台的游戏就可以做得更好啦!
有12位网友表示赞同!
我一直在期待这样的改进。开发团队总是绞尽脑汁想出新办法提高游戏性能。
有10位网友表示赞同!
这个链接器的改进一定会让游戏开发人员感到高兴的。
有7位网友表示赞同!
我的电脑配置一般,希望这些提升能让我在游戏中获得更好的体验!
有6位网友表示赞同!
我玩的游戏很多都是独立开发的游戏,我相信这个更新可能会让他们受益良多。
有11位网友表示赞同!
期待看到更多关于这个链接器的细节和测试结果!
有19位网友表示赞同!
新技术总是让人兴奋的时候,希望最终能带来更好的游戏体验。
有5位网友表示赞同!
也许我可以用这个新的链接器来优化我的自学研发的项目!
有14位网友表示赞同!
这听起来像一个非常有潜力且实用的更新,我很期待看到它的应用!
有9位网友表示赞同!
如果能让人们下载游戏的过程中更快一点,那将是极大的改进!
有20位网友表示赞同!
我听说一些大型游戏甚至会因为可执行包的大小而导致玩家无法安装。这个链接器或许可以解决这个问题?
有19位网友表示赞同!
希望未来更多游戏都能够采用这种新的技术,让游戏体验更加流畅和优质!
有19位网友表示赞同!
如果我的游戏能从这些改进中获益,那就会是令人高兴的事情!
有6位网友表示赞同!
我很期待这个更新能够帮助那些追求极致性能的游戏工作室!
有6位网友表示赞同!