• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Go119-那些事国产芯片内存模型等新特性你知道多少

php 搞java代码 3年前 (2022-08-01) 59次浏览 已收录 0个评论
文章目录[隐藏]

大家好,我是煎鱼。

感觉工夫过得很快,Go1.18 公布没太久,泛型还在风风火火,看了看上次的投票后果,绝大部分同学还没有在生产环境利用泛型。

这不,Go1.19 Beta1 曾经正式公布了。明天就由煎鱼和大家围观《Go 1.19 Release Notes》中一些有意思的个性。

内存模型

Go 的内存模型已被订正,以使 Go 与 C、C++、Java、JavaScript、Rust 和 Swift 应用的内存模型保持一致。Go 只提供程序统一的原子学,而不是其余语言中的任何更宽松的模式。

另外随着内存模型的更新,Go1.19 在 sync/atomic 包中引入了新的类型,使之更容易应用原子值,如 atomic.Int64 和 atomic.Pointer[T]。

文档做了以下具体的批改:

  • 记录 Go 的整体内存模型形容。
  • 记录 multiword 竞态会导致解体的状况。
  • 记录 runtime.SetFinalizer 的 happens-before。
  • 记录(或链接)更多同步类型的产生前。
  • 记录同步/原子的产生工夫,匹配 C++ 的程序统一的原子(以及Java、JavaScript、Rust、Swift、C…)。
  • 记录不容许的编译器优化。

这个只是 “订正”,是改了文档和定义,并不波及内存模型的代码变更。

为此 Russ Cox 写了 Go Memory Model 的三篇文章作为系列阐明:

  • 《Hardware Memory Models》
  • 《Programming Language Memory Models》
  • 《Updating the Go Memory Model》

有趣味的同学能够浏览。

文档标准

Russ Cox 在提案《Proposal: go/doc: headings, lists, and links in Go doc comments》中,减少了对文档正文中的链接、列表和更清晰的题目的反对。

Go 1.19 文档曾经产生了变动。如下:

旧(左)与新(右)的比照图。

手动贴链接变可跳转:

手动分行变成无序列表辨别:

这算是 Go 文档从远古时代到新 Markdown 的一个大降级了。

构建束缚

从 Go1.19 起,构建束缚 unix 当初能够在 //go:build 行中被辨认,可能起到配套的束缚作用。

如下格局:

<code class="shell">//go:build unix

须要留神的是,在 1.19 版本中,如果 GOOS 是 aix、android、darwin、dragonfly、freebsd、hurd、illumos、ios、linux、netbsd、openbsd 或 solaris 中的一种,也是满足 unix 束缚的。

龙芯架构

龙芯(Loongson)是由中国科学院计算技术研究所、龙芯中科、神州龙芯等机构、公司所设计的一系列各种芯片(包含通用中央处理器、SoC、微控制器、芯片组等)。

在 Go 1.19 起减少了对 Linux 上 Loongson 64 位架构的反对(GOOS=linux,GOARCH=loong64)。

前段时间还看到龙芯中科,在科创板上市,成国产CPU第一股。国产芯片走进 Go 语言,应该也是国人推动的,太强了!

竞态检测

Go 的竞态资源检测(race detector)曾经公布到 v3 版本了,将会追随 Go1.19 一起上线到生产可用。

与 v2 版相比,新版本的 race detector 在性能上快 1.5 倍到 2 倍,应用一半的内存,并且反对有限数量的 goroutine。

注:windows/amd64 和 openbsd/amd64 暂未反对。

Switch 性能进步

Go 编译器当初应用 jump table 来实现大型整数和字符串类型的 swicth 语句。switch 语句的性能改良各不相同,但能够快 20% 左右。

注:本次仅波及 GOARCH=amd64GOARCH=arm64 的变更。

运行时

堆内存限度

新版本的 Go 减少了 runtime.SetMemoryLimit 函数和 GOMEMLIMIT 环境变量。

关注到 runtime.SetMemoryLimit 函数为运行时提供了一个内存的软限度。

函数签名为:

<code class="go">func SetMemoryLimit(limit int64) int64

有了这个内存的软限度后,Go 运行时将会恪守这个内存限度,行为包含:调整垃圾回收的频率、更踊跃地将内存返回到底层零碎等,来维持这个软内存的限度。

另外即便 GOGC=off(或者是执行了 SetGCPercent(-1) 函数),也会恪守软内存的限度。

有了内存软限度,个别场景下,能够无效的避免因为堆内存调配过多,导致 Go 过程超出零碎内存资源的最大被 KILL 的场景。

一个漏网之鱼,是限度不了的。那就是它不包含:Go 二进制应用的空间和 Go 内部的内存,例如:由底层零碎代表过程治理的内存,或由同一过程中的非 Go 代码治理的内存(CGO)。

Goroutine 堆栈

新版本中 Go 运行时将依据 goroutine 的历史均匀堆栈使用率来调配初始 goroutine 堆栈(大雾,太坏了,Go 面试题的题目答案又要改了…)。

能够无效防止一些不必要的堆栈增长和复制,在低于平均水平的状况下,能节俭最多 2 倍的空间节约。

这是一个比拟粗疏的优化点了。

泛型改良

Go1.19 还在一直地欠缺泛型的路上,这次变更来自标准《spec: adjust scope of type parameters declared by method receivers》,波及到的是对办法申明中类型参数的范畴做了一个十分小的修改。

原有形容:

The scope of an identifier denoting a type parameter of a function or declared by a method receiver is the function body and all parameter lists of the function.

订正形容:

The scope of an identifier denoting a type parameter of a function or declared by a method receiver starts after the function name and ends at the end of the function body.

在 Go1.18 时,以下泛型代码会提醒谬误:

<code class="go">type T[T any] struct {}

func (T[T]) m() {} // error: T is not a generic type

在新版本(1.19 起)将会正确反对,不会产生编译谬误。

其余的泛型进度来讲,还是在修修补补:

有待持续察看。

总结

在本次 Go1.19 的新版本更新中,新个性是比拟少的。其中次要的起因还是泛型的各项工作给 Go 团队带来了不少的工作量。

往年也陆续有个别大佬来到,所以整体可用于其余新个性的工夫就比拟少了。

这个版本能够认为是小版本,填了一些小 “坑” 了,国内个别面试题的答案也会因而有所扭转了。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

Go 图书系列

  • Go 语言入门系列:初探 Go 我的项目实战
  • Go 语言编程之旅:深刻用 Go 做我的项目
  • Go 语言设计哲学:理解 Go 的为什么和设计思考
  • Go 语言进阶之旅:进一步深刻 Go 源码

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Go119-那些事国产芯片内存模型等新特性你知道多少

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址