成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.17 新特性,憑什么提速 5~10%?

開發 后端
在 Go1.17 發布后,我們驚喜的發現 Go 語言他又又又優化了,編譯器改進后產生了約 5% 的性能提升,也沒有什么破壞性修改,保證了向前兼容。

 [[420321]]

大家好,我是煎魚。

在 Go1.17 發布后,我們驚喜的發現 Go 語言他又又又優化了,編譯器改進后產生了約 5% 的性能提升,也沒有什么破壞性修改,保證了向前兼容。

他做了些什么呢,好像沒怎么看到有人提起。為此今天煎魚帶大家來解讀兩新提案:

  • 《Proposal: Register-based Go calling convention[1]》
  • 《Proposal: Create an undefined internal calling convention[2]》

本文會基于提案講解和拆解,畢竟分享新知識肯定要從官方資料作為事實基準出發。

背景

在以往的 Go 版本中,Go 的調用約定簡單且幾乎跨平臺通用,其原因在于選用了基于 Plan9 ABI 的堆棧調用約定,也就是函數的參數和返回值都是通過堆棧上來進行傳遞。

這里我們一共提到了 Plan9 和 ABI,這是兩個很關鍵的理念:

  • Plan9:Go 語言所使用的匯編器,Rob Pike 是貝爾實驗室的猛人。
  • ABI:Application Binary Interface(應用程序二進制接口),ABI 包含了應用程序在操作系統下運行時必須遵守的編程約定(例如:二進制接口)。

該方案的優缺點如下:

  • 優點:實現簡單,簡化了實現成本。
  • 缺點:性能方面付出了不少的代價。

按我理解,在 Go 語言初創時期,采取先簡單實現,跑起來再說。也合理,性能倒不是一個 TOP1 需求。

Go1.17 優化

什么是調用慣例

在新版本的優化中,提到了調用慣例(calling convention)的概念,指的是調用方和被調用方對函數調用的共識約定。

這些共識包含:函數的參數、返回值、參數傳遞順序、傳遞方式等。

雙方都必須遵循這個約定時,程序的函數才能正常的運行起來。如果不遵循,那么該函數是沒法運行起來的。

優化是什么

在 Go1.17 起,正式開始基于 Go 內部 ABI 規范(在 Go 函數之間使用),并且從原有的基于堆棧的函數參數和結果傳遞的方式改為基于寄存器的函數參數和結果傳遞。

在性能上,現在直接存儲和計算都在寄存器上,和以前基于堆棧存儲,再計算相比,現在這種模式勢必是性能更優的。

本次修改涉及到的項非常多,該優化是持續的,原本預計是 Go1.16 實現,不過拖到了 Go1.17。

目前實現了 amd64 和 arm64 架構的支持。還有不少的更多的支持會持續在 Go1.18 中完成,具體進度可見 issues #40724[3]。

性能如何

在 Go1.17 Release Notes[4] 中明確指出,用一組有代表性的 Go 包和程序的基準測試。

官方數據顯示:

  • Go 程序的運行性能提高了約 5%。
  • Go 所編譯出的二進制大小的減少約 2%。

在民間數據來看,在 twitter[5] 看到 @Achille 表示從 Go1.15.7 升級到 Go1.17 后顯示。在一個大規模的數據處理系統上進行的 Go1.17 升級產生了驚人的效果,我們來看看他的真實數據。

CPU、Malloc 調用時間減少了約15%:

圖來自 @Achille

圖來自 @Achille

RSS 大小更接近于堆的大小:

圖來自 @Achille

內存方面從原本的 1.6GB 降至 1GB。

結合官方和民間數據來看,優化效果是明確且有效的。有興趣的小伙伴也可以自己測一測。

不過需要注意,@Achille 的數據是包含 Go1.16 和 Go1.17 的優化的,沒法直接對比,但可以參考。

總結

在 Go1.17 這一個新版本中,只需要簡單的升一升 Go 版本,我們就能得到一定的性能優化,這是非常不錯的。

不過這一改動,Go 的匯編又變了,怕不是市面上很多文章或書的部分內容又失效了。

從以往的基于堆棧的函數參數和結果傳遞的方式改為 Go1.17~Go1.18 基于寄存器的函數參數和結果傳遞,Go 語言正在一步步走的更好!

你覺得呢?

參考資料

[1]Proposal: Register-based Go calling convention: https://go.googlesource.com/proposal/+/master/design/40724-register-calling.md

[2]Proposal: Create an undefined internal calling convention: https://go.googlesource.com/proposal/+/master/design/27539-internal-abi.md

[3]issues #40724: https://github.com/golang/go/issues/40724

[4]Go1.17 Release Notes: https://golang.org/doc/go1.17

[5]twitter: https://twitter.com/Achille/status/1431014148800802819

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2021-09-05 18:25:30

Go命令倉庫

2021-09-01 07:21:46

堆棧Gopanic

2021-05-30 22:53:05

Go1.17版本 tip

2021-08-19 09:37:06

Go 1.17語言架構

2018-05-18 15:05:25

JavaJava 10新特性

2024-01-22 00:30:00

Go編程Go 1.22

2021-12-27 18:27:18

GoTryLockJava

2019-03-05 15:03:09

Android Q安卓系統功能

2020-11-24 13:05:35

Go語言泛型

2009-06-29 17:42:03

Tapestry5新特

2011-08-30 09:07:30

HTML 5

2021-08-30 08:23:34

Go語言進程

2022-02-11 21:01:18

GoNetip網絡庫

2021-02-02 09:10:12

Go語言二進制

2011-07-12 13:21:34

2011-11-09 10:05:26

HTML 5

2017-06-06 16:30:55

戴爾交付保障

2015-07-06 09:46:21

AeroGearAndroid推送

2025-04-27 08:00:35

2021-08-19 09:43:09

Fedora 35LLVMGo 1.17
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人天堂网址 | 最新国产在线 | av黄色在线 | 91免费在线视频 | 国产精品久久久久久久久久久久久 | 7777奇米影视| 国产一区二区免费 | 在线一区二区三区 | 福利视频亚洲 | 91新视频| 日韩精品一区二区三区中文在线 | 国产精品无码永久免费888 | 欧美精品欧美精品系列 | 91精品综合久久久久久五月天 | 全免费a级毛片免费看视频免费下 | 国产又爽又黄的视频 | 精品欧美一区二区三区久久久 | 日韩av资源站 | 99视频免费在线 | 自拍偷拍第一页 | 亚洲欧美日韩精品久久亚洲区 | 麻豆精品久久 | 大吊一区二区 | 国产美女黄色片 | 一区二区成人 | 欧美日韩精品区 | 国产精品入口 | 欧美黄色网 | 国产亚洲欧美日韩精品一区二区三区 | 有码一区 | 国产亚洲第一页 | h片在线播放 | 农夫在线精品视频免费观看 | 91福利在线观看视频 | 成人午夜高清 | 久久久精品 | 久久com| 日韩成人精品在线观看 | 色男人天堂av | 日本一区二区影视 | 成人黄色三级毛片 |