第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將幾個(gè) []byte 連接在一起的最快方法是什么?

將幾個(gè) []byte 連接在一起的最快方法是什么?

Go
開滿天機(jī) 2021-11-01 17:34:33
現(xiàn)在我正在使用下面的代碼(如 中所示BenchmarkEncoder())并且速度很快,但我想知道是否有更快、更有效的方法。我用GOMAXPROCS=1和作為基準(zhǔn):sudo -E nice -n -20 go test -bench . -benchmem -benchtime 3s.package blackbirdimport (    "testing"    "encoding/hex"    "log"    "bytes"    "encoding/json")var (    d1, d2, d3, d4, outBytes []byte    toEncode [][]byte)func init() {    var err interface{}    d1, err = hex.DecodeString("6e5438fd9c3748868147d7a4f6d355dd")    d2, err = hex.DecodeString("0740e2dfa4b049f2beeb29cc304bdb5f")    d3, err = hex.DecodeString("ab6743272358467caff7d94c3cc58e8c")    d4, err = hex.DecodeString("7411c080762a47f49e5183af12d87330e6d0df7dd63a44808db4e250cdea0a36182fce4a309842e49f4202eb90184dd5b621d67db4a04940a29e981a5aea59be")    if err != nil {        log.Fatal("hex decoding failed: %v", err)    }    toEncode = [][]byte{d1, d2, d3, d4}}func Encode(stuff [][]byte) []byte {    return bytes.Join(stuff, nil)}func BenchmarkEncoderDirect(b *testing.B) {    for i := 0; i < b.N; i++ {        bytes.Join(toEncode, nil)    }}func BenchmarkEncoder(b *testing.B) {    for i := 0; i < b.N; i++ {        Encode(toEncode)    }}func BenchmarkJsonEncoder(b *testing.B) {    for i := 0; i < b.N; i++ {        outBytes, _ = json.Marshal(toEncode)    }}將多個(gè)連接[]byte在一起的最快方法是什么?
查看完整描述

2 回答

?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊

bytes.Join()非???,但它做了一些額外的工作,在可附加的字節(jié)片之間附加分隔符。即使分隔符為空或nil切片,它也會(huì)這樣做。


因此,如果您關(guān)心最佳性能(盡管它會(huì)略有改進(jìn)),您可以bytes.Join()在不附加(空)分隔符的情況下執(zhí)行以下操作:分配一個(gè)足夠大的字節(jié)切片,并使用內(nèi)置的將每個(gè)切片復(fù)制到結(jié)果中copy()功能。


在Go Playground上試試:


func Join(s ...[]byte) []byte {

    n := 0

    for _, v := range s {

        n += len(v)

    }


    b, i := make([]byte, n), 0

    for _, v := range s {

        i += copy(b[i:], v)

    }

    return b

}

使用它:


concatenated := Join(d1, d2, d3, d4)

改進(jìn):


如果您事先知道總大?。ɑ蛘吣梢员妊h(huán)切片更快地計(jì)算它),提供它,您可以避免必須循環(huán)切片以計(jì)算所需的大小:


func JoinSize(size int, s ...[]byte) []byte {

    b, i := make([]byte, size), 0

    for _, v := range s {

        i += copy(b[i:], v)

    }

    return b

}

在您的情況下使用它:


concatenated := JoinSize(48 + len(d4), d1, d2, d3, d4)

筆記:


但是,如果您最終的目標(biāo)是將連接的字節(jié)切片寫入一個(gè)io.Writer,性能方面最好不要連接它們,而是將每個(gè)切片單獨(dú)寫入。


查看完整回答
反對(duì) 回復(fù) 2021-11-01
?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

總的來說,@icza 的回答是正確的。但是,對(duì)于您的特定用例,您可以分配一次并更有效地解碼到該緩沖區(qū):


像這樣:


package main


import (

    "encoding/hex"

)


func main() {

    h1 := []byte("6e5438fd9c3748868147d7a4f6d355dd")

    h2 := []byte("0740e2dfa4b049f2beeb29cc304bdb5f")

    h3 := []byte("ab6743272358467caff7d94c3cc58e8c")

    h4 := []byte("7411c080762a47f49e5183af12d87330e6d0df7dd63a44808db4e250cdea0a36182fce4a309842e49f4202eb90184dd5b621d67db4a04940a29e981a5aea59be")


    tg := make([]byte, 16+16+16+(1024*1024)) // allocate enough space for the 3 IDs and a max 1MB of extra data


    hex.Decode(tg[:16], h1)

    hex.Decode(tg[16:32], h2)

    hex.Decode(tg[32:48], h3)

    l, _ := hex.Decode(tg[48:], h4)


    tg = tg[:48+l]

}

在該代碼的末尾,tg保存 3 個(gè) ID 加上可變長(zhǎng)度的第 4 個(gè)數(shù)據(jù)塊,連續(xù)解碼。


查看完整回答
反對(duì) 回復(fù) 2021-11-01
  • 2 回答
  • 0 關(guān)注
  • 555 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)