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

Go arena 民間庫(kù)來(lái)了,可以手動(dòng)管理內(nèi)存!

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

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

上年我們有討論過(guò)關(guān)于 Go arena 手動(dòng)管理內(nèi)存的相關(guān)提案。一開(kāi)始還高歌猛進(jìn),但沒(méi)想到后面由于嚴(yán)重的 API 問(wèn)題(想把 arena 應(yīng)用到其他的標(biāo)準(zhǔn)庫(kù)中,但會(huì)引入大問(wèn)題):

圖片圖片

Go 核心團(tuán)隊(duì)中途咕咕咕到現(xiàn)在,沒(méi)有新的推動(dòng)和突破性進(jìn)展,實(shí)屬尷尬。

圖片圖片

最近有社區(qū)的大佬有了新的動(dòng)作,來(lái)自 Grafana 的 @Miguel ángel Ortu?o 開(kāi)源了一個(gè)新的第三方庫(kù) ortuman/nuke[1],用于完成 arena 手動(dòng)管理內(nèi)存的訴求。

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

溫習(xí)前置知識(shí)

Arena 指的是一種從一個(gè)連續(xù)的內(nèi)存區(qū)域分配一組內(nèi)存對(duì)象的方式。當(dāng)然了,它的重點(diǎn)是要手動(dòng)管理內(nèi)存,實(shí)現(xiàn)一些編程上的內(nèi)存管理目標(biāo)。

優(yōu)點(diǎn)比一般的內(nèi)存分配更有效率,也可以一次性釋放。缺點(diǎn)上需要程序員在編程時(shí)手動(dòng)管理,有可能會(huì)泄漏和錯(cuò)釋放,增大了心智負(fù)擔(dān)。

簡(jiǎn)單來(lái)講就是,Arena 可以手動(dòng)管理內(nèi)存,可以做很多事,有利有弊。也 “容易” 崩。

快速介紹

安裝

安裝命令如下:

go get -u github.com/ortuman/nuke

需要注意這個(gè)庫(kù)要求 go >= 1.21.7,在實(shí)際下載前建議先進(jìn)行升級(jí)。

使用案例

常規(guī)使用

基本使用該 arean 庫(kù)的用法,代碼如下:

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})
 }
 // 做一些煎魚(yú)的業(yè)務(wù)邏輯...
    
 arena.Reset(true)
 ...
}
  • 初始化一個(gè)新的 arean 內(nèi)存區(qū)域,緩沖區(qū)大小為 256KB,最大內(nèi)存上限為 20MB。
  • 聲明和分配一個(gè) Foo 類(lèi)型的新對(duì)象和容量為 10 個(gè)元素的 Foo 切片。
  • 業(yè)務(wù)邏輯完成后,重置所申請(qǐng)的 arean 內(nèi)存區(qū)域(釋放)。

以上是最常用的方式,相當(dāng)于在某一塊代碼片段中進(jìn)行初始化和處理。

基于 context 場(chǎng)景

如果我們需要在 HTTP 請(qǐng)求這類(lèi)整個(gè)生命周期中去使用。

可以借助 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)
    // 給煎魚(yú)靜悄悄干點(diǎn)什么...
}

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)
}

在請(qǐng)求端 http context 中注入 arena,再在實(shí)際處理的地方通過(guò) context 獲取 arena,以此達(dá)到穿越整體生命周期的方式。

基于并發(fā)場(chǎng)景

默認(rèn)場(chǎng)景下,nuke.NewMonotonicArena 初始化出來(lái)的 arena,有一個(gè)隱性的坑,他不是并發(fā)安全的!

大膽猜測(cè),這是基于性能的考慮,所以沒(méi)有做到一起。畢竟鎖會(huì)很吃資源。而在 Go 里要去做手動(dòng)內(nèi)存管理的場(chǎng)景,多少又對(duì)性能有一定的訴求。

在有并發(fā)訴求的場(chǎng)景下,可以使用 NewConcurrentArena 函數(shù):

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

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

除了換了個(gè)初始化方法,其他用法與常規(guī)用法差不多。

也看了下官方的 Benchmarks,確實(shí)是基于性能考慮的區(qū)分并發(fā)與非并發(fā)的業(yè)務(wù)場(chǎng)景。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

總結(jié)

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

基于此,我們介紹了民間大佬的 arena 開(kāi)源庫(kù) ortuman/nuke。基本功能和使用都能夠滿足需求。后續(xù)有此類(lèi)業(yè)務(wù)需求時(shí),可以隨時(shí)拿起來(lái)就用!

參考資料

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

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

2023-02-26 22:47:45

Go管理內(nèi)存

2024-12-03 08:47:01

2022-11-15 09:16:59

2022-07-20 10:33:50

RustGo內(nèi)存管理

2024-10-22 14:20:00

AI模型

2018-03-09 12:40:41

內(nèi)存降價(jià)國(guó)產(chǎn)

2023-11-02 10:32:27

GoGORM

2014-01-14 09:10:53

GoHTTP內(nèi)存泄漏

2021-05-30 19:29:12

內(nèi)存Go語(yǔ)言

2022-10-10 11:37:14

Gomap內(nèi)存

2010-03-05 13:59:16

Linux服務(wù)器內(nèi)存

2010-01-12 11:52:40

2022-05-13 23:46:52

GO編程內(nèi)存

2017-12-06 08:58:03

AndroidGo系統(tǒng)

2023-10-29 17:15:57

2010-05-28 11:36:37

桌面虛擬化

2013-11-25 14:33:17

Windows 9概念圖

2021-11-05 08:28:27

內(nèi)存泄漏調(diào)試

2018-07-23 09:26:08

iOS內(nèi)存優(yōu)化

2013-10-11 17:32:18

Linux運(yùn)維內(nèi)存管理
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 日本亚洲欧美 | 国产激情一区二区三区 | 国产精品久久久久aaaa九色 | 成人免费看片 | 成人av电影天堂 | 91看片在线观看 | 国产视频线观看永久免费 | 国产精品一区在线观看 | 电影91久久久 | 国产精品国产三级国产aⅴ中文 | 一区二区三区视频免费观看 | 激情亚洲 | 99精品国产一区二区三区 | 色免费在线视频 | 99热成人在线 | 久久婷婷国产香蕉 | 国产成人免费视频网站高清观看视频 | 久草网站 | 日韩毛片 | 中文字幕人成人 | 在线成人 | 国产高清在线观看 | 99久久精品免费看国产小宝寻花 | 亚洲啪啪| www成人啪啪18 | 一区二区三区国产 | 美女福利视频网站 | 在线免费看毛片 | 精品一区二区三区视频在线观看 | 久久久日韩精品一区二区三区 | 精品国产一区三区 | 日日操夜夜操天天操 | 欧美一级网站 | 国产精品91视频 | 亚洲国产成人精品女人 | 亚洲91精品 | 中文日韩在线 | 亚洲精品第一 | 国产精品久久久久久久久久久久 | 久久精品无码一区二区三区 | a级大毛片|