自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go1.19 那些事:國(guó)產(chǎn)芯片、內(nèi)存模型等新特性,你知道多少?

開(kāi)發(fā) 前端
Go 的內(nèi)存模型已被修訂,以使 Go 與 C、C++、Java、JavaScript、Rust 和 Swift 使用的內(nèi)存模型保持一致。Go 只提供順序一致的原子學(xué),而不是其他語(yǔ)言中的任何更寬松的形式。

大家好,我是煎魚(yú)。

感覺(jué)時(shí)間過(guò)得很快,Go1.18 發(fā)布沒(méi)太久,泛型還在風(fēng)風(fēng)火火,看了看上次的投票結(jié)果,絕大部分同學(xué)還沒(méi)有在生產(chǎn)環(huán)境應(yīng)用泛型。

這不,Go1.19 Beta1 已經(jīng)正式發(fā)布了。今天就由煎魚(yú)和大家圍觀《Go 1.19 Release Notes[1]》中一些有意思的特性。

內(nèi)存模型

Go 的內(nèi)存模型已被修訂,以使 Go 與 C、C++、Java、JavaScript、Rust 和 Swift 使用的內(nèi)存模型保持一致。Go 只提供順序一致的原子學(xué),而不是其他語(yǔ)言中的任何更寬松的形式。

圖片

另外隨著內(nèi)存模型的更新,Go1.19 在 sync/atomic 包中引入了新的類型,使之更容易使用原子值,如 atomic.Int64 和 atomic.Pointer[T]。

文檔做了以下具體的修改:

  • 記錄 Go 的整體內(nèi)存模型描述。
  • 記錄 multiword 競(jìng)態(tài)會(huì)導(dǎo)致崩潰的情況。
  • 記錄 runtime.SetFinalizer 的 happens-before。
  • 記錄(或鏈接)更多同步類型的發(fā)生前。
  • 記錄同步/原子的發(fā)生時(shí)間,匹配 C++ 的順序一致的原子(以及Java、JavaScript、Rust、Swift、C...)。
  • 記錄不允許的編譯器優(yōu)化。

這個(gè)只是 “修訂”,是改了文檔和定義,并不涉及內(nèi)存模型的代碼變更。

文檔規(guī)范

Russ Cox 在提案《Proposal: go/doc: headings, lists, and links in Go doc comments[5]》中,增加了對(duì)文檔注釋中的鏈接、列表和更清晰的標(biāo)題的支持。

Go 1.19 文檔已經(jīng)發(fā)生了變化。如下:

圖片

舊(左)與新(右)的對(duì)比圖。

手動(dòng)貼鏈接變可跳轉(zhuǎn):

圖片

手動(dòng)分行變成無(wú)序列表區(qū)分:

圖片

這算是 Go 文檔從遠(yuǎn)古時(shí)代到新 Markdown 的一個(gè)大升級(jí)了。

構(gòu)建約束

從 Go1.19 起,構(gòu)建約束 unix 現(xiàn)在可以在 //go:build 行中被識(shí)別,能夠起到配套的約束作用。

如下格式:

//go:build unix

需要注意的是,在 1.19 版本中,如果 GOOS 是 aix、android、darwin、dragonfly、freebsd、hurd、illumos、ios、linux、netbsd、openbsd 或 solaris 中的一種,也是滿足 unix 約束的。

龍芯架構(gòu)

龍芯(Loongson)是由中國(guó)科學(xué)院計(jì)算技術(shù)研究所、龍芯中科、神州龍芯等機(jī)構(gòu)、公司所設(shè)計(jì)的一系列各種芯片(包括通用中央處理器、SoC、微控制器、芯片組等)。

圖片

在 Go 1.19 起增加了對(duì) Linux 上 Loongson 64 位架構(gòu)的支持(GOOS=linux,GOARCH=loong64)。

前段時(shí)間還看到龍芯中科,在科創(chuàng)板上市,成國(guó)產(chǎn) CPU 第一股。國(guó)產(chǎn)芯片走進(jìn) Go 語(yǔ)言,應(yīng)該也是國(guó)人推進(jìn)的,太強(qiáng)了!

競(jìng)態(tài)檢測(cè)

Go 的競(jìng)態(tài)資源檢測(cè)(race detector)已經(jīng)發(fā)布到 v3 版本了,將會(huì)跟隨 Go1.19 一起上線到生產(chǎn)可用。

與 v2 版相比,新版本的 race detector 在性能上快 1.5 倍到 2 倍,使用一半的內(nèi)存,并且支持無(wú)限數(shù)量的 goroutine。

注:windows/amd64 和 openbsd/amd64 暫未支持。

Switch 性能提高

Go 編譯器現(xiàn)在使用 jump table[6] 來(lái)實(shí)現(xiàn)大型整數(shù)和字符串類型的 swicth 語(yǔ)句。switch 語(yǔ)句的性能改進(jìn)各不相同,但可以快 20% 左右。

注:本次僅涉及 GOARCH=amd64 和 GOARCH=arm64 的變更。

運(yùn)行時(shí)

堆內(nèi)存限制

新版本的 Go 增加了 runtime.SetMemoryLimit 函數(shù)和 GOMEMLIMIT 環(huán)境變量。

關(guān)注到 runtime.SetMemoryLimit 函數(shù)為運(yùn)行時(shí)提供了一個(gè)內(nèi)存的軟限制。

函數(shù)簽名為:

func SetMemoryLimit(limit int64) int64

有了這個(gè)內(nèi)存的軟限制后,Go 運(yùn)行時(shí)將會(huì)遵守這個(gè)內(nèi)存限制,行為包括:調(diào)整垃圾回收的頻率、更積極地將內(nèi)存返回到底層系統(tǒng)等,來(lái)維持這個(gè)軟內(nèi)存的限制。

另外即使 GOGC=off(或者是執(zhí)行了 SetGCPercent(-1) 函數(shù)),也會(huì)遵守軟內(nèi)存的限制。

有了內(nèi)存軟限制,一般場(chǎng)景下,可以有效的防止由于堆內(nèi)存分配過(guò)多,導(dǎo)致 Go 進(jìn)程超出系統(tǒng)內(nèi)存資源的最大被 KILL 的場(chǎng)景。

一個(gè)漏網(wǎng)之魚(yú),是限制不了的。那就是它不包括:Go 二進(jìn)制使用的空間和 Go 外部的內(nèi)存,例如:由底層系統(tǒng)代表進(jìn)程管理的內(nèi)存,或由同一進(jìn)程中的非 Go 代碼管理的內(nèi)存(CGO)。

Goroutine 堆棧

新版本中 Go 運(yùn)行時(shí)將根據(jù) goroutine 的歷史平均堆棧使用率來(lái)分配初始 goroutine 堆棧(大霧,太壞了,Go 面試題的題目答案又要改了...)。

可以有效避免一些不必要的堆棧增長(zhǎng)和復(fù)制,在低于平均水平的情況下,能節(jié)省最多 2 倍的空間浪費(fèi)。

這是一個(gè)比較細(xì)致的優(yōu)化點(diǎn)了。

泛型改進(jìn)

Go1.19 還在不斷地完善泛型的路上,這次變更來(lái)自規(guī)范《spec: adjust scope of type parameters declared by method receivers[7]》,涉及到的是對(duì)方法聲明中類型參數(shù)的范圍做了一個(gè)非常小的修正。

原有描述:

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 時(shí),以下泛型代碼會(huì)提示錯(cuò)誤:

type T[T any] struct {}

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

在新版本(1.19 起)將會(huì)正確支持,不會(huì)發(fā)生編譯錯(cuò)誤。

其他的泛型進(jìn)度來(lái)講,還是在修修補(bǔ)補(bǔ):

圖片

有待繼續(xù)觀察。

總結(jié)

在本次 Go1.19 的新版本更新中,新特性是比較少的。其中主要的原因還是泛型的各項(xiàng)工作給 Go 團(tuán)隊(duì)帶來(lái)了不少的工作量。

今年也陸續(xù)有個(gè)別大佬離開(kāi),所以整體可用于其他新特性的時(shí)間就比較少了。

這個(gè)版本可以認(rèn)為是小版本,填了一些小 “坑” 了,國(guó)內(nèi)個(gè)別面試題的答案也會(huì)因此有所改變了。

參考資料

[1]Go 1.19 Release Notes: https://tip.golang.org/doc/go1.19

[2]Hardware Memory Models: https://research.swtch.com/hwmm

[3]Programming Language Memory Models: https://research.swtch.com/plmm

[4]Updating the Go Memory Model: https://research.swtch.com/gomm

[5]Proposal: go/doc: headings, lists, and links in Go doc comments: https://github.com/golang/proposal/blob/master/design/51082-godocfmt.md

[6]jump table: https://en.wikipedia.org/wiki/Branch_table

[7]spec: adjust scope of type parameters declared by method receivers: https://github.com/golang/go/issues/52038

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚(yú)了
相關(guān)推薦

2023-02-06 08:51:30

PGO編譯速度

2023-08-09 08:53:50

GoWASI語(yǔ)義

2015-06-19 13:54:49

2024-02-21 07:24:21

微服務(wù)單體架構(gòu)MVC

2021-05-17 08:18:35

Java內(nèi)存模型JMM

2010-08-09 13:20:36

Flex

2017-11-03 13:43:24

云計(jì)算Saas信息化

2013-12-12 17:50:36

開(kāi)源系統(tǒng)Linux

2014-12-02 10:38:41

5G

2023-09-04 07:49:43

2017-12-27 11:59:52

2014-04-01 13:54:32

AndroidStudioEclipse

2013-09-12 14:24:31

2015-06-29 09:40:10

Rails新特性

2011-11-29 15:32:11

2022-09-15 08:33:11

ChaosBladeJava場(chǎng)景

2011-07-04 13:51:02

QT 對(duì)象 模型

2024-11-08 08:34:59

RocketMQ5.Remoting通信

2019-05-20 13:45:15

MySQL新特性數(shù)據(jù)庫(kù)

2019-11-08 15:11:03

Java架構(gòu)數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)