国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang: 模仿 VictoriaMetrics 中的做法,通過(guò)把局部變量放在自定義 Context 對(duì)象中來(lái)做到hot path 的 0 alloc

這篇具有很好參考價(jià)值的文章主要介紹了golang: 模仿 VictoriaMetrics 中的做法,通過(guò)把局部變量放在自定義 Context 對(duì)象中來(lái)做到hot path 的 0 alloc。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

作者:張富春(ahfuzhang),轉(zhuǎn)載時(shí)請(qǐng)注明作者和引用鏈接,謝謝!

  • cnblogs博客
  • zhihu
  • Github
  • 公眾號(hào):一本正經(jīng)的瞎扯
    golang: 模仿 VictoriaMetrics 中的做法,通過(guò)把局部變量放在自定義 Context 對(duì)象中來(lái)做到hot path 的 0 alloc

使用 benchmark 壓測(cè)過(guò)程中通常會(huì)出現(xiàn)這樣的信息:

go test -v -bench=. -benchmem
f1     10000        120860 ns/op        2433 B/op         28 allocs/op
f2     10000        120288 ns/op        2288 B/op         26 allocs/op

可以看見(jiàn) f1 在每次運(yùn)行都產(chǎn)生了 28 次內(nèi)存分配。
gc 通常是 golang 最大的性能殺手,減少內(nèi)存分配對(duì)性能提升非常明顯。

可以把程序區(qū)分為 hot path非hot path,hot path 即運(yùn)行最頻繁,消耗時(shí)間最多的程序執(zhí)行路徑。VictoriaMetrics 的作者 Valyala 建議在 Hot path 上做到 0 alloc.

然而,必須需要在函數(shù)間傳遞的對(duì)象指針,必然需要引起 alloc。減少內(nèi)存分配的一個(gè)辦法是 sync.Pool,但是如果在 A 函數(shù)中使用 sync.Pool.Get, 而在 B 函數(shù)中使用 sync.Pool.Put,這樣的程序流程比較混亂,不容易維護(hù)。且,當(dāng)存在大量的不同對(duì)象時(shí),其 sync.Pool 的種類(lèi)也很多;sync.Pool 還有全局鎖,會(huì)影響程序的并發(fā)性。

VictoriaMetrics 中大量的使用了這樣的技巧:

1. 定義自己的 Context 對(duì)象

type MyContext struct{

}

// 業(yè)務(wù)函數(shù)的第一個(gè)參數(shù)都是 MyContext
func BizFunc1(ctx *MyContext){}

func BizFunc2(ctx *MyContext){}

2. 所有在函數(shù)間傳遞的變量(引起棧逃逸的),都定義在 MyContext 中

type MyContext struct{
     tempBuffer []byte
}

//  如果函數(shù)都依賴(lài) tempBuffer, 把局部變量定義到 MyContext 中
func BizFunc1(ctx *MyContext){
     ctx.tempBuffer = append(ctx.tempBuffer, "str1"...)
}

func BizFunc2(ctx *MyContext){
    ctx.tempBuffer = append(ctx.tempBuffer, "str2"...)
}

3. MyContext 本身從 sync.Pool 中獲取

var poolOfMyContext = sync.Pool{
    New: func() interface{}{
        return &MyContext{}
    }
}

// 業(yè)務(wù)入口函數(shù)
func BizEntrance(){
    ctx := poolOfMyContext.Get().(*MyContext)
    defer poolOfMyContext.Put(ctx)
    //
    callBizFunc(ctx)  // 業(yè)務(wù)邏輯函數(shù)
}

4. MyContext 對(duì)象提供 Reset() 方法

對(duì)分配好的各種緩沖區(qū)重用,避免反復(fù)分配。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-582418.html

func (c *MyContext) Reset() {
     c.tempBuffer = c.tempBuffer[:0]  // 重用分配好的空間
}

// 業(yè)務(wù)入口函數(shù)
func BizEntrance(){
    ctx := poolOfMyContext.Get().(*MyContext)
    ctx.Reset()  // 需要清空內(nèi)容,避免上次的數(shù)據(jù)干擾運(yùn)行結(jié)果
    defer poolOfMyContext.Put(ctx)
    //
    callBizFunc(ctx)  // 業(yè)務(wù)邏輯函數(shù)
}

到了這里,關(guān)于golang: 模仿 VictoriaMetrics 中的做法,通過(guò)把局部變量放在自定義 Context 對(duì)象中來(lái)做到hot path 的 0 alloc的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C語(yǔ)言趣味教學(xué)】(6) 作用域:局部變量 | 全局變量 | 局部變量?jī)?yōu)先原則 | 利用大括號(hào)限制作用域 | 變量的生命周期

    【C語(yǔ)言趣味教學(xué)】(6) 作用域:局部變量 | 全局變量 | 局部變量?jī)?yōu)先原則 | 利用大括號(hào)限制作用域 | 變量的生命周期

    ??? ?? 【C語(yǔ)言趣味教程】專(zhuān)欄介紹?? 猛戳了解?。?! 0x00 引入:什么是作用域? 變量和常量在程序中都是有作用范圍的,這個(gè)范圍我們稱(chēng)之為變量的? 作用域 (scope) 。 作用域也稱(chēng)為 \\\"定義域\\\",是程序中 定義的變量所存在的區(qū)域,出了該區(qū)域變量就不能被訪問(wèn)。 變量的作

    2024年02月14日
    瀏覽(19)
  • 【C語(yǔ)言趣味教程】(6) 作用域:局部變量 | 全局變量 | 局部變量?jī)?yōu)先原則 | 利用大括號(hào)限制作用域 | 變量的生命周期

    【C語(yǔ)言趣味教程】(6) 作用域:局部變量 | 全局變量 | 局部變量?jī)?yōu)先原則 | 利用大括號(hào)限制作用域 | 變量的生命周期

    ??? ?? 【C語(yǔ)言趣味教程】專(zhuān)欄介紹?? 猛戳了解?。?! 0x00 引入:什么是作用域? 變量和常量在程序中都是有作用范圍的,這個(gè)范圍我們稱(chēng)之為變量的? 作用域 (scope) 。 作用域也稱(chēng)為 \\\"定義域\\\",是程序中 定義的變量所存在的區(qū)域,出了該區(qū)域變量就不能被訪問(wèn)。 變量的作

    2024年02月14日
    瀏覽(30)
  • 漲知識(shí)-關(guān)于局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量

    局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量必須用final修飾 局部?jī)?nèi)部類(lèi)在訪問(wèn)它所在方法中的局部變量必須用final修飾,為什么? 因?yàn)楫?dāng)調(diào)用這個(gè)方法時(shí),局部變量如果沒(méi)有final修飾,它的生命周期和方法的生命周期是一樣的, 當(dāng)方法彈棧時(shí),這個(gè)局部變量也會(huì)消失。 那么如果局部?jī)?nèi)部類(lèi)對(duì)象

    2024年02月03日
    瀏覽(22)
  • Java成員變量(全局變量)和局部變量

    在Java中變量類(lèi)型有 成員變量 、 局部變量 和 靜態(tài)變量(類(lèi)變量、static變量) ,本篇文章主要介紹成員變量(全局變量)和局部變量的區(qū)別。 根據(jù)變量的作用范圍,將程序中的變量分為成員變量(全局變量)和局部變量。 一、成員變量(全局變量) 成員變量(全局變量):

    2024年02月04日
    瀏覽(35)
  • Python的全局變量、局部變量、類(lèi)變量、實(shí)例變量介紹

    Python的全局變量、局部變量、類(lèi)變量、實(shí)例變量介紹

    Python 的變量分類(lèi) 全局變量:模塊內(nèi)、所有函數(shù)外、所有class外的變量; 局部變量:函數(shù)內(nèi)的變量,class的方法內(nèi)且不使用self.修飾的變量; 類(lèi)變量:class內(nèi)且不在class的方法內(nèi); 實(shí)例變量:class的方法內(nèi)且使用self.修飾的變量。 對(duì)于面向過(guò)程程序設(shè)計(jì)涉及: 全局變量:模塊中

    2024年02月03日
    瀏覽(29)
  • 通過(guò)模仿學(xué)會(huì)Python爬蟲(chóng)(一):零基礎(chǔ)上手

    通過(guò)模仿學(xué)會(huì)Python爬蟲(chóng)(一):零基礎(chǔ)上手

    好家伙,爬蟲(chóng)來(lái)了 ? 爬蟲(chóng),這玩意,不會(huì)怎么辦, 誒,先抄一份作業(yè)回來(lái) ?Python爬蟲(chóng)史上超詳細(xì)講解(零基礎(chǔ)入門(mén),老年人都看的懂)_ChenBinBini的博客-CSDN博客 ? ?臥槽,有點(diǎn)東西 這東西看上去挺nb啊, 也很方便,把我想要的一些數(shù)據(jù)直接總結(jié)到一個(gè)excel表格中了? ? ?我們

    2024年02月09日
    瀏覽(159)
  • Java 成員變量與局部變量有什么區(qū)別?

    Java 成員變量與局部變量有什么區(qū)別?

    節(jié)選自JavaGuide(Github 標(biāo)星 134k star!「Java學(xué)習(xí) + 面試指南」一份涵蓋大部分 Java 程序員所需要掌握的核心知識(shí)) 語(yǔ)法形式 :從語(yǔ)法形式上看,成員變量是屬于類(lèi)的,而局部變量是在代碼塊或方法中定義的變量或是方法的參數(shù);成員變量可以被 public , private , static 等修飾符所修

    2024年02月05日
    瀏覽(27)
  • c語(yǔ)言全局變量和局部變量問(wèn)題匯總

    ?作者簡(jiǎn)介:嵌入式領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客專(zhuān)家 ?個(gè)人主頁(yè):咸魚(yú)弟 ??系列專(zhuān)欄:?jiǎn)纹瑱C(jī)設(shè)計(jì)專(zhuān)欄? 1、static的作用是什么?? 定義靜態(tài)變量? 2、static有什么用途?(請(qǐng)至少說(shuō)明兩種)? 1).限制變量的作用域(在程序的整個(gè)運(yùn)行期間都不釋放)? 2).設(shè)置變量的存儲(chǔ)域(存

    2024年02月06日
    瀏覽(29)
  • MySQL數(shù)據(jù)庫(kù)——存儲(chǔ)過(guò)程-變量(系統(tǒng)變量、用戶(hù)定義變量、局部變量)

    目錄 系統(tǒng)變量? 1.查看系統(tǒng)變量? 2.設(shè)置系統(tǒng)變量 演示示例 用戶(hù)定義變量 1.賦值? 2.使用 演示示例 局部變量 聲明? 賦值 演示示例 變量 在MySQL中變量分為三種類(lèi)型: 系統(tǒng)變量、用戶(hù)定義變量、局部變量。 系統(tǒng)變量是MySQL服務(wù)器提供,不是用戶(hù)定義的,屬于服務(wù)器層面。分為全

    2024年02月05日
    瀏覽(43)
  • 堆,棧,程序區(qū),靜態(tài)變量,局部變量,函數(shù),參數(shù)宏

    ? ? ? ?堆和棧是堆和棧是在程序運(yùn)行中用于 存儲(chǔ)數(shù)據(jù)和指令 的兩種不同的內(nèi)存空間。 堆:堆內(nèi)存是 用于分配程序中動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間 ,它的生命周期不由 程序的函數(shù)調(diào)用棧管理 ,通常會(huì)被 程序員 直接管理。 ? ? ? ?堆空間為程序 提供了極為靈活的空間分配和管

    2024年01月24日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包