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

Go arena 民間庫來了,可以手動管理內存!

開發 前端
今天給大家分享了 Go 官方 arena 的最新進展和情況,主體上還是由于嚴重 API 原因(擔憂像 context 一樣造成傳染性)沒有突破性進展。雖然有人提出可以放到 unsafe 庫中,也獲得了許多人表情點贊。但仍然沒能打動 Go 核心團隊的同學。

大家好,我是煎魚。

上年我們有討論過關于 Go arena 手動管理內存的相關提案。一開始還高歌猛進,但沒想到后面由于嚴重的 API 問題(想把 arena 應用到其他的標準庫中,但會引入大問題):

圖片圖片

Go 核心團隊中途咕咕咕到現在,沒有新的推動和突破性進展,實屬尷尬。

圖片圖片

最近有社區的大佬有了新的動作,來自 Grafana 的 @Miguel ángel Ortu?o 開源了一個新的第三方庫 ortuman/nuke[1],用于完成 arena 手動管理內存的訴求。

今天我們基于官方資料此進行使用分享和介紹,也好未雨綢繆一下。

溫習前置知識

Arena 指的是一種從一個連續的內存區域分配一組內存對象的方式。當然了,它的重點是要手動管理內存,實現一些編程上的內存管理目標。

優點比一般的內存分配更有效率,也可以一次性釋放。缺點上需要程序員在編程時手動管理,有可能會泄漏和錯釋放,增大了心智負擔。

簡單來講就是,Arena 可以手動管理內存,可以做很多事,有利有弊。也 “容易” 崩。

快速介紹

安裝

安裝命令如下:

go get -u github.com/ortuman/nuke

需要注意這個庫要求 go >= 1.21.7,在實際下載前建議先進行升級。

使用案例

常規使用

基本使用該 arean 庫的用法,代碼如下:

import (
 "github.com/ortuman/nuke"
)

type Foo struct{ A int }

func main() {
 arena := nuke.NewMonotonicArena(256*1024, 80)

 fooRef := nuke.New[Foo](arena "Foo")
 fooSlice := nuke.MakeSlice[Foo](arena, 0, 10 "Foo")

 for i := 0; i < 20; i++ {
  fooSlice = nuke.SliceAppend(arena, fooSlice, Foo{A: i})
 }
 // 做一些煎魚的業務邏輯...
    
 arena.Reset(true)
 ...
}
  • 初始化一個新的 arean 內存區域,緩沖區大小為 256KB,最大內存上限為 20MB。
  • 聲明和分配一個 Foo 類型的新對象和容量為 10 個元素的 Foo 切片。
  • 業務邏輯完成后,重置所申請的 arean 內存區域(釋放)。

以上是最常用的方式,相當于在某一塊代碼片段中進行初始化和處理。

基于 context 場景

如果我們需要在 HTTP 請求這類整個生命周期中去使用。

可以借助 context,使用如下方式:

func httpHandler(w http.ResponseWriter, r *http.Request) {
    arena := nuke.NewMonotonicArena(64*1024, 10)
    defer arena.Reset(true)

    ctx := nuke.InjectContextArena(r.Context(), arena)
    processRequest(ctx)
    // 給煎魚靜悄悄干點什么...
}

func processRequest(ctx context.Context) {
    arena := nuke.ExtractContextArena(ctx)

    // ...
}

func main() {
    http.HandleFunc("/", httpHandler)    fmt.Println("Server is listening on port 8080...")
    http.ListenAndServe(":8080", nil)
}

在請求端 http context 中注入 arena,再在實際處理的地方通過 context 獲取 arena,以此達到穿越整體生命周期的方式。

基于并發場景

默認場景下,nuke.NewMonotonicArena 初始化出來的 arena,有一個隱性的坑,他不是并發安全的!

大膽猜測,這是基于性能的考慮,所以沒有做到一起。畢竟鎖會很吃資源。而在 Go 里要去做手動內存管理的場景,多少又對性能有一定的訴求。

在有并發訴求的場景下,可以使用 NewConcurrentArena 函數:

import (
 "github.com/ortuman/nuke"
)

func main() {
 arena := nuke.NewConcurrentArena(
            nuke.NewMonotonicArena(256*1024, 20),
        )
 defer arena.Reset(true)
 // 和煎魚煎個魚看看...
}

除了換了個初始化方法,其他用法與常規用法差不多。

也看了下官方的 Benchmarks,確實是基于性能考慮的區分并發與非并發的業務場景。QPS 越大,性能差距越大:

BenchmarkMonotonicArenaNewObject/100-8                    124495      15469 ns/op        0 B/op        0 allocs/op
BenchmarkMonotonicArenaNewObject/1000-8                    76744      19602 ns/op        0 B/op        0 allocs/op
BenchmarkMonotonicArenaNewObject/10000-8                   24104      50845 ns/op        0 B/op        0 allocs/op
BenchmarkMonotonicArenaNewObject/100000-8                   3282     366044 ns/op        0 B/op        0 allocs/op
BenchmarkConcurrentMonotonicArenaNewObject/100-8           90392      16679 ns/op        0 B/op        0 allocs/op
BenchmarkConcurrentMonotonicArenaNewObject/1000-8          43753      29823 ns/op        0 B/op        0 allocs/op
BenchmarkConcurrentMonotonicArenaNewObject/10000-8          8037     149923 ns/op        0 B/op        0 allocs/op
BenchmarkConcurrentMonotonicArenaNewObject/100000-8          879    1364377 ns/op

總結

今天給大家分享了 Go 官方 arena 的最新進展和情況,主體上還是由于嚴重 API 原因(擔憂像 context 一樣造成傳染性)沒有突破性進展。雖然有人提出可以放到 unsafe 庫中,也獲得了許多人表情點贊。但仍然沒能打動 Go 核心團隊的同學。

基于此,我們介紹了民間大佬的 arena 開源庫 ortuman/nuke?;竟δ芎褪褂枚寄軌驖M足需求。后續有此類業務需求時,可以隨時拿起來就用!

參考資料

[1]ortuman/nuke: https://github.com/ortuman/nuke

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

2023-02-26 22:47:45

Go管理內存

2024-12-03 08:47:01

2022-11-15 09:16:59

2022-07-20 10:33:50

RustGo內存管理

2024-10-22 14:20:00

AI模型

2023-11-02 10:32:27

GoGORM

2014-01-14 09:10:53

GoHTTP內存泄漏

2018-03-09 12:40:41

內存降價國產

2021-05-30 19:29:12

內存Go語言

2022-10-10 11:37:14

Gomap內存

2010-03-05 13:59:16

Linux服務器內存

2010-01-12 11:52:40

2022-05-13 23:46:52

GO編程內存

2010-05-28 11:36:37

桌面虛擬化

2013-11-25 14:33:17

Windows 9概念圖

2023-10-29 17:15:57

2017-12-06 08:58:03

AndroidGo系統

2018-07-23 09:26:08

iOS內存優化

2013-10-11 17:32:18

Linux運維內存管理

2024-01-15 11:12:28

Go內存開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩一区二区三区四区五区 | 国产区高清 | 久久另类视频 | 看av网址 | 免费观看羞羞视频网站 | 国产电影一区二区三区爱妃记 | 精品久久久久久久久久久院品网 | 欧美激情国产日韩精品一区18 | 日韩有码一区 | 亚洲一区视频 | 久草视频观看 | 精久久 | 久久久www成人免费精品 | 欧美一级www片免费观看 | 亚洲成人福利在线观看 | 天天干天天插 | 欧美日韩在线免费观看 | 在线不卡视频 | 自拍偷拍欧美 | 国产精品成人一区二区三区夜夜夜 | 金莲网| 精品成人在线 | 日韩欧美高清 | 最近日韩中文字幕 | 日本aa毛片a级毛片免费观看 | 天天操夜夜操 | 久草网址 | 欧美精品久久久 | 日本中文字幕日韩精品免费 | 欧美精产国品一二三区 | 亚洲国产精品99久久久久久久久 | 伊人成人免费视频 | 综合二区 | 蜜臀网| 亚洲免费网站 | 欧美日韩手机在线观看 | 96久久久久久 | 欧美成人h版在线观看 | 91精品国产91久久综合桃花 | 色黄爽 | www.嫩草|