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

Golang中降本增效的常規(guī)實(shí)踐

開發(fā) 前端
如果您想要逐字節(jié)地從磁盤讀取數(shù)據(jù),與每次直接從磁盤讀取每個(gè)字節(jié)相比,使用緩沖區(qū)IO技術(shù),我們可以一次將一個(gè)數(shù)據(jù)塊讀入緩沖區(qū),然后消費(fèi)者可以以任何您想要的方式從緩沖區(qū)讀取數(shù)據(jù)。通過減少繁重的系統(tǒng)調(diào)用,性能將得到提高

最近一年各大中小廠都在搞"優(yōu)化",說到優(yōu)化,目的還是"降本增效",降低成本,增加效益(效率)。

技術(shù)層面,也有一些降本增效的常規(guī)操作。

比如池化、io緩沖區(qū)技術(shù)


golang

C#

eg.

池化技術(shù)

snnc.Pool

ObjectPool

前端切圖仔,歸入前端資源池 , 隨用隨取

字節(jié)數(shù)組緩沖區(qū)

bytes.Buffer

List

---

io緩沖區(qū)

bufio

BufferStream

適度超前,賽道埋伏

池化技術(shù) sync.Pool

sync.Pool位于標(biāo)準(zhǔn)庫,該文件提供了對(duì)臨時(shí)對(duì)象的重復(fù)使用能力, 避免了頻繁的gc, 對(duì)并發(fā)協(xié)程是安全的。

該文件只有三個(gè)控制點(diǎn):

  • ? New: 默認(rèn)的臨時(shí)對(duì)象
  • ? Get:從池中哪一個(gè)臨時(shí)對(duì)象
  • ? Put:放回池中,以重用

下面使用基準(zhǔn)測(cè)試進(jìn)行b.N*1000次運(yùn)算時(shí)的內(nèi)存消耗。

package main

import (
    "sync"
    "testing"
)

type Person struct {
    Age int
}

var (
    personPool = sync.Pool{
        New: func() interface{} {  // 設(shè)置默認(rèn)值
            return &Person{}
        },
    }
)

func ExampleObjPool() {
    var p *Person
    for i := 0; i < 1000; i++ {
        for j := 0; j < 1000; j++ {
            p = personPool.Get().(*Person)
            p.Age = i + 1
            personPool.Put(p)
        }
    }
    p = personPool.Get().(*Person)
    fmt.Println(p.Age)
    // output:1000
}

func BenchmarkWithoutPool(b *testing.B) {
    var p *Person
    b.ReportAllocs()
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
        for j := 0; j < 1000; j++ {
            p = new(Person)    // 每次均產(chǎn)生臨時(shí)對(duì)象
            p.Age = 23
        }
    }
}

func BenchmarkWithPool(b *testing.B) {
    var p *Person
    b.ReportAllocs()
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
        for j := 0; j < 1000; j++ {
            p = personPool.Get().(*Person)  // 從池中復(fù)用對(duì)象
            p.Age = 23
            personPool.Put(p)     // 放回以重用
        }
    }
}

測(cè)試結(jié)果如下,sync.Pool[重用臨時(shí)對(duì)象]的性能可見一斑。

圖片圖片

bytes.Buffer

golang很多方法內(nèi)充斥了[]byte, 就連最常規(guī)的序列化/反序列化,返回值/參數(shù)都是[]byte, 但是slice是一個(gè)冷冰冰的數(shù)據(jù)結(jié)構(gòu),沒有得心趁手的操作行為,還有很多陷阱。

func Marshal(v any) ([]byte, error)
  func Unmarshal(data []byte, v any)

A bytes.Buffer is a variable-sized buffer of bytes with Read and Write methods.
坦白講bytes.Buffer并非底層優(yōu)化機(jī)制, 實(shí)際提供了一個(gè)友好操作slice的方式。 

下面的"abcd"字符串,先讀取首字符、后面追加字符"e":

var b bytes.Buffer
    b.Write([]byte("abcd")) // 寫入之后,自動(dòng)擴(kuò)容
    rdbuf := make([]byte, 1)
    _, err := b.Read(rdbuf) // 讀取一個(gè)字節(jié)的數(shù)據(jù),移動(dòng)讀off指針
    if err != nil {
        panic(err)
    }
    fmt.Println(b.String()) // 上面讀取了一個(gè)字符,讀off已經(jīng)移動(dòng),現(xiàn)從讀off位置轉(zhuǎn)換為string
    b.WriteByte('e')        // 在尾部寫字符
    fmt.Println(b.String())
    fmt.Printf("%d, %d \n", b.Len(), b.Cap()) // Len方法返回還能讀取的字符數(shù)量,Cap返回底層buf的容量
  
//output:
bcd 
bcde
4, 64

圖片圖片

io緩沖區(qū) bufio

Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer object, creating another object (Reader or Writer) that also implements the interface but provides buffering and some help for textual I/O.

圖片圖片

首先我們需要知道當(dāng)應(yīng)用程序執(zhí)行IO操作(從文件、網(wǎng)絡(luò)和數(shù)據(jù)庫讀取或?qū)懭霐?shù)據(jù)),它將觸發(fā)底層的系統(tǒng)調(diào)用,從性能角度來看,這很繁重。

緩沖IO是一種技術(shù),用于在傳遞之前暫時(shí)積累IO操作的結(jié)果。這種技術(shù)可以通過減少系統(tǒng)調(diào)用的次數(shù)來提高程序的速度。

例如,如果您想要逐字節(jié)地從磁盤讀取數(shù)據(jù),與每次直接從磁盤讀取每個(gè)字節(jié)相比,使用緩沖區(qū)IO技術(shù),我們可以一次將一個(gè)數(shù)據(jù)塊讀入緩沖區(qū),然后消費(fèi)者可以以任何您想要的方式從緩沖區(qū)讀取數(shù)據(jù)。通過減少繁重的系統(tǒng)調(diào)用,性能將得到提高。

磁盤:1.尋址:ms(毫秒) 2.磁盤帶寬[1]:MB/s
內(nèi)存:1.尋址:ns(納秒) 2. 內(nèi)存帶寬[2]:GB/s
磁盤比內(nèi)存在尋址上慢了10W倍,傳輸帶寬上慢了20倍。

開源的帶緩沖區(qū)的logrus日志寫入hook[3],就利用了bufio技術(shù)。

// 利用bufio針對(duì)原始io.Writer封裝成帶緩沖區(qū)的io.Writer  
 `s.writer = bufio.NewWriterSize(s.Writer, size) 
  ......
  if len(bs) > s.writer.Available() && s.writer.Buffered() > 0 {
        if err := s.writer.Flush(); err != nil {
            return err
        }
    }
    _, err = s.writer.Write(bs)`

優(yōu)化總結(jié)

  • sync.Pool 復(fù)用臨時(shí)對(duì)象,減少內(nèi)存分配和gc次數(shù)
  • bufio利用緩沖區(qū),減少笨重的系統(tǒng)調(diào)用
  • 其實(shí)就是“降本增效”的體現(xiàn)。

引用鏈接

[1] 磁盤帶寬: https://it.sohu.com/a/580279682_121118998

[2] 內(nèi)存帶寬: https://baike.baidu.com/item/內(nèi)存帶寬

[3] 帶緩沖區(qū)的logrus日志寫入hook: https://github.com/zwbdzb/logrus-bufferedWriter-hook

責(zé)任編輯:武曉燕 來源: 精益碼農(nóng)
相關(guān)推薦

2022-06-02 14:39:11

混沌工程實(shí)驗(yàn)微服務(wù)

2024-09-30 08:47:07

數(shù)據(jù)分析降本增效覆蓋用戶

2024-08-07 11:06:49

2024-03-27 12:31:54

數(shù)據(jù)分析降本增效促銷活動(dòng)

2024-09-20 08:20:20

2022-07-13 14:54:52

邊緣計(jì)算人工智能機(jī)器學(xué)習(xí)

2024-02-20 13:29:04

網(wǎng)絡(luò)安全研發(fā)

2023-12-25 15:38:55

2024-02-19 14:14:02

云計(jì)算人工智能大語言模型

2023-10-12 19:05:13

研發(fā)管理降本增效AI

2023-09-25 15:13:57

數(shù)字化轉(zhuǎn)型

2022-03-28 14:31:01

Python編程語言工具包

2016-08-10 21:22:34

大數(shù)據(jù)運(yùn)營商

2018-04-25 19:58:00

華為

2024-04-19 14:43:16

云計(jì)算分布式

2022-12-07 13:58:56

Cloudera

2022-11-29 15:11:54

騰訊云開源FinOps
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 精一区二区 | 久久久国产一区二区三区 | 91色在线| 国产成人精品高清久久 | 欧美成人一区二免费视频软件 | 亚洲a一区二区 | 久久性 | 亚洲精品久久久久中文字幕欢迎你 | 久久久久久亚洲精品 | 男女视频91 | 亚洲国产精品成人 | 久久精品久久久久久 | 久久国产精品精品国产色婷婷 | 日韩成人在线播放 | 日本久久精品视频 | 午夜久久久久久久久久一区二区 | 欧美精品91爱爱 | 成人免费大片黄在线播放 | 欧美精品第一页 | 日本成人片在线观看 | 国产乱码久久久久久一区二区 | 中文字幕日韩欧美一区二区三区 | 日韩精品网站 | 欧美日韩高清 | 免费小视频在线观看 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲一区中文字幕在线观看 | 91网站在线播放 | 亚洲精品日韩欧美 | 午夜在线视频 | 国产成人精品区一区二区不卡 | 国产91视频播放 | 亚洲精品二区 | 中国一级大黄大片 | 91 久久| 日日日视频 | 国产精品视频久久 | www久久国产 | 精品久久久久久红码专区 | 久久久久国产 | 91福利电影在线观看 |