大家好,我是煎鱼。

大概半年前,我写过一篇文章《Go 要违背初心吗?新提案:手动管理内存》。有兴趣了深入解的同学,可以再回顾一下。

当时我们还想着 Go 团队应该不会接纳,至少不会那么快:

没想到,计划赶不上变化。

懒得翻也可以看我再次道来,本文提到的提案《proposal: arena: new package providing memory arenas[1]》,这其中的 Arena 将会是一个突破项。

快速背景

Arena 指的是一种从一个连续的内存区域分配一组内存对象的方式。优点比一般的内存分配更有效率,也可以一次性释放。当然了,它的重点是要手动管理内存

Go 团队希望加进 Go 特性中,示例代码如下:

import (“arena”…
)type T struct {val int
}func main() {a := arena.New()var ptrT *Ta.New(&ptrT)ptrT.val = 1var sliceT []Ta.NewSlice(&sliceT, 100)sliceT[99].val = 4a.Free()
}

手动调用 arena.New 方法分配 arena 内存,再调用 Free 方法进行释放。

简单来讲就是可以手动管理内存,就可以做很多事了,因为可以乱来,所以也 “容易” 崩。

最新进展

这个提案一直在 issues 上适度的争议讨论,@Michael Knyszek 大佬代码写的很快,已经直接提交上去了...直到最近被人发现,让他更新进度。

已经明确:Go1.20 将会支持 arena 特性,通过 GOEXPERIMENT=arena 来打开,接受大家的 review 和使用,社区当前抗阻较小。

已实现 API 和原提案不同的地方有:

  • API 使用了泛型,例如:arena.New[int](myArena "int")

  • Arena 的 块大小是 8 MiB 而不是 64 MiB,似乎在更多情况下提供了更好的性能。

  • MSAN 和 ASAN 模式可用于识别不会导致崩溃的 use-after-free 错误(内存损坏应该仍然是不可能的)。需注意,这些模式对非 cgo 的 Go 程序几乎没有作用。Arena 是个例外。

另外根据社区的反馈,可能还会出现配套类型的 Arena。如下函数签名:

// MakeMap creates a new map[K]V with the provided capacity.
// The map[K]V must not be used after the arena is freed.
// Accessing the underlying storage of the map after free may result in a fault,
// but this fault is also not guaranteed.
func MakeMap[K comparable, V any](a *Arena, cap int "K comparable, V any") map[K]V { ... }

在 Go1.20 发布该新特性的话,按照发布周期计划,是 2 月份左右发布,相信大家很快就能用上,可以多多关注。

总结

一开始了解这个提案时,还想着 Go 搞了快 10 年才采纳和推进泛型。这 Arena 应该不至于这么快吧?毕竟加进去了,许多程序都可以写的复杂起来。

没想到...现实打脸来的太快,推进的很快。

就像其他小伙伴说的,这可以直接从代码侧优化性能,而不需要砍需求。也是一个有意思且不错的源动力!

据小道消息,某些同学表示在框架和其它场景测过,有说变得快了,有说没差多少。比较迷,提案内暂时未提供测试报告,不好定论。

Go 1.20 Beta 将在未来几周内(2022.11 月底前)发布,让我们拭目以待:)

推荐阅读

  • Go 只会 if err != nil?这是不对的,分享这些优雅的处理姿势给你!

  • Go 错误处理新思路?用左侧函数和表达式

  • 先睹为快,Go2 Error 的挣扎之路

参考资料

[1]

proposal: arena: new package providing memory arenas: https://github.com/golang/go/issues/51317

关注和加煎鱼微信,

获取一手业内消息和知识,拉你进交流群

打脸了兄弟们,Go1.20 arena 来了!相关推荐

  1. Go1.20 arena新特性示例详解

    当时我们还想着 Go 团队应该不会接纳,至少不会那么快: 懒得翻也可以看我再次道来,本文提到的提案<proposal: arena: new package providing memory a ...

  2. Go1.20 继续小修小补 errors 库。。。

    大家好,我是煎鱼. Go 的错误处理机制一直是无数人提了又争,被拒了又提的地方.最近 Go1.20 即将发布,针对 errors 标准库,有一个新的小修小补优化(wrapping multiple e ...

  3. Go最新版下载 Go1.20版新特性

    Go官方正式发布了Go1.20稳定版 该版本依然保持 Go1 兼容性,可以升级到 Go1.20,而不需要做任何代码改动. 可以使用你任何喜欢的方式升级: 比如: go install golang.o ...

  4. 谷歌官方正式发布了Go1.20稳定版「8千字详解」

    Go1.20 变化不少,该版本依然保持 Go1 兼容性,我们可以升级到 Go1.20,而不需要做任何代码改动. 可以使用你任何喜欢的方式升级: 比如:go install golang.org/dl/ ...

  5. go 1.20 手动内存管理arena

    go1.20新特性,手动内存管理 测试特性安装go1.20rc go install golang.org/dl/go1.20rc1@latest go1.20rc1 download 使用go1.2 ...

  6. 16 岁少年前往腾讯总部要求解封 QQ 账号;微软发内部信辟谣:没有关闭微软苏州的相关计划;Go 1.20 发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. Go 1.20要来了,看看都有哪些变化-第1篇

    前言 Go官方团队在2022.12.08发布了Go 1.20 rc1(release candidate)版本,Go 1.20的正式release版本预计会在2023年2月份发布. 让我们先睹为快,看 ...

  8. 16 岁少年前往腾讯总部要求解封 QQ 账号;微软发内部信辟谣:没有关闭微软苏州的相关计划;Go 1.20 发布|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  9. Golang交叉编译Sqlite3踩坑记录

    Golang交叉编译Sqlite3踩坑记录 ,windows下编译golang go-sqlite3解决方案 众所周知Golang能够在一个平台编译不同平台可执行程序进行发布 然而在遇到需要内置处理程 ...

最新文章

  1. VMWare虚拟机连接方式
  2. cocos2dx JS 层(Layer)的生命周期
  3. 【git学习二】git基础之git管理本地项目
  4. jQuery.merge与concat的区别
  5. android流程化步骤样式,Android RecyclerView 解析之绘制流程篇
  6. java io null异常_大量java.lang.InterruptedException: null异常,数据没有同步
  7. [JS-BOM]BOM_Location地址栏对象
  8. )标识符不能是c语言的关键字,标识符不能是C的关键字
  9. php 日期转毫秒_【小技巧】 各种日期操作方法汇总
  10. android 技能标签功能_android专业技能总结.doc
  11. MSDN最新的2007年6月的中文版本发布了
  12. 倍福PLC控制台达EtherCAT伺服案例分析
  13. 网络机顶盒可以直接刷linux吗_卡盟刷钻平台免费刷-上海装修报价
  14. 1155低功耗cpu排行_低功耗是亮点 Intel第三代酷睿CPU评测
  15. blowfish算法c语言,Blowfish 算法工具(Blowfish Tool)
  16. 3rd TMA大数据营销案例征集赛正式启动,报名ing!
  17. 我的世界服务器自定义怪物怎么用,我的世界完全自定义怪物教程攻略
  18. JSP实现简单的登录页面实现及代码(非连接数据库)
  19. 既生 HTTP 何生 WebSocket ?
  20. Trello中的Scrum

热门文章

  1. Linux 开机自启动多个脚本程序
  2. 打开思维,新年开工一定要元气满满!
  3. js闭包优缺点及其应用?
  4. tp6 think-swoole4.0 websocket 使用的坑
  5. 多元正态产生随机数python_【python讲概率】S05E06 多元正态分布及其性质
  6. svn怎么上传文件到具体目录linux,linux系统下SVN同步文件到WEB目录
  7. CVPR 2021 | 上交和国科大提出DCL:旋转目标检测新方法
  8. “重走长征路,共铸铁军魂“ 拉练活动总结
  9. 【SQL】数据库变为\SUSPECT\状态的解决方法
  10. python代码写父亲节快乐_父爱如山,深情似海——你的代码像诗一样