Go1.20 arena新特性示例详解

 更新时间:2022年11月15日 16:37:54   作者:煎鱼eddycjy  
这篇文章主要为大家介绍了Go1.20 arena新特性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

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

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

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

快速背景

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

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

import (
 “arena”
 …
)
type T struct {
 val int
}
func main() {
 a := arena.New()
 var ptrT *T
 a.New(&ptrT)
 ptrT.val = 1
 var sliceT []T
 a.NewSlice(&sliceT, 100)
 sliceT[99].val = 4
 a.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 月底前)发布,让我们拭目以待:)

以上就是Go1.20 arena新特性示例详解的详细内容,更多关于Go1.20 arena新特性的资料请关注脚本之家其它相关文章!

相关文章

  • Golang并发编程之Channel详解

    Golang并发编程之Channel详解

    传统的并发编程模型是基于线程和共享内存的同步访问控制的,共享数据受锁的保护,使用线程安全的数据结构会使得这更加容易。本文将详细介绍Golang并发编程中的Channel,,需要的朋友可以参考下
    2023-05-05
  • Golang 实现Redis 协议解析器的解决方案

    Golang 实现Redis 协议解析器的解决方案

    这篇文章主要介绍了Golang   实现 Redis 协议解析器,本文将分别介绍Redis 通信协议 以及 协议解析器 的实现,若您对协议有所了解可以直接阅读协议解析器部分,需要的朋友可以参考下
    2022-10-10
  • golang解析html网页的方法

    golang解析html网页的方法

    今天小编就为大家分享一篇golang解析html网页的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Golang分布式应用之Redis示例详解

    Golang分布式应用之Redis示例详解

    这篇文章主要为大家介绍了Golang分布式应用之Redis示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang高并发之本地缓存详解

    golang高并发之本地缓存详解

    这篇文章主要为大家详细介绍了golang高并发中本地缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • Go语言中工作池的原理与实现

    Go语言中工作池的原理与实现

    工作池是一种并发编程模式,它使用一组固定数量的工作线程来执行任务队列中的工作单元,本文将介绍工作池的工作原理,并通过代码示例演示其在实际应用中的用途,有需要的可以参考下
    2023-10-10
  • 如何在golang中检查文件是否存在

    如何在golang中检查文件是否存在

    如果你用的是 Python,可通过 os.path.exists 这样的标准库函数实现,遗憾的是,Go 标准库没有提供这样直接的函数,所以下面我们就来了解下如何使用GO语言能实现检查文件是否存在呢
    2024-02-02
  • 一文详解kubernetes 中资源分配的那些事

    一文详解kubernetes 中资源分配的那些事

    这篇文章主要为大家介绍了kubernetes 中资源分配的那些事,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Go语言框架Beego项目搭建的方法步骤

    Go语言框架Beego项目搭建的方法步骤

    这篇文章主要介绍了Go语言框架Beego项目搭建的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Golang Http请求返回结果处理

    Golang Http请求返回结果处理

    本文主要介绍了Golang Http请求返回结果处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论