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

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

Go按位運(yùn)算性能之謎

Go按位運(yùn)算性能之謎

Go
慕碼人2483693 2023-03-21 17:21:08
在對(duì)從字節(jié)數(shù)組到 s 的轉(zhuǎn)換性能進(jìn)行基準(zhǔn)測試時(shí)uint32,我注意到從最低有效位開始時(shí)轉(zhuǎn)換運(yùn)行得更快:package blahimport (    "testing"    "encoding/binary"    "bytes")func BenchmarkByteConversion(t *testing.B) {    var i uint32 = 3419234848    buf := new(bytes.Buffer)    _ = binary.Write(buf, binary.BigEndian, i)    b := buf.Bytes()    for n := 0; n < t.N; n++ {        // Start with least significant bit: 0.27 nanos        value := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[2])<<16 | uint32(b[0])<<24        // Start with most significant bit: 0.68 nanos        // value := uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])        _ = value    }}當(dāng)我運(yùn)行時(shí),計(jì)算第一種方式go test -bench=.時(shí)每次迭代獲得 0.27 納米,計(jì)算第二種方式時(shí)每次迭代獲得 0.68 納米。為什么將數(shù)字放在一起時(shí)從最低有效位開始的速度是原來的兩倍?valuevalue|
查看完整描述

1 回答

?
幕布斯6054654

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

沒有什么神秘之處。優(yōu)化!


package blah


import (

    "bytes"

    "encoding/binary"

    "testing"

)


func BenchmarkByteConversionLeast(t *testing.B) {

    var i uint32 = 3419234848

    buf := new(bytes.Buffer)

    _ = binary.Write(buf, binary.BigEndian, i)

    b := buf.Bytes()


    for n := 0; n < t.N; n++ {

        // Start with least significant bit: 0.27 nanos

        value := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[2])<<16 | uint32(b[0])<<24

        _ = value

    }

}


func BenchmarkByteConversionMost(t *testing.B) {

    var i uint32 = 3419234848

    buf := new(bytes.Buffer)

    _ = binary.Write(buf, binary.BigEndian, i)

    b := buf.Bytes()


    for n := 0; n < t.N; n++ {

        // Start with most significant bit: 0.68 nanos

        value := uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])

        _ = value

    }

}

輸出:


go test silly_test.go -bench=.

goos: linux

goarch: amd64

BenchmarkByteConversionLeast-4      2000000000           0.72 ns/op

BenchmarkByteConversionMost-4       2000000000           1.80 ns/op

這應(yīng)該是顯而易見的。邊界檢查消除。


只需使用常識(shí)。如果檢查索引 3、2、1 和 0 的數(shù)組邊界,則可以在 3 處停止檢查,因?yàn)轱@然 2、1 和 0 也是有效的。如果檢查索引 0、1、2 和 3 的數(shù)組邊界,則必須檢查所有索引的邊界。一次邊界檢查與四次邊界檢查。

維基百科:邊界檢查

維基百科:邊界檢查消除


您還應(yīng)該閱讀好的代碼,例如 Go 標(biāo)準(zhǔn)庫。例如,

func (littleEndian) PutUint64(b []byte, v uint64) {

    _ = b[7] // early bounds check to guarantee safety of writes below

    b[0] = byte(v)

    b[1] = byte(v >> 8)

    b[2] = byte(v >> 16)

    b[3] = byte(v >> 24)

    b[4] = byte(v >> 32)

    b[5] = byte(v >> 40)

    b[6] = byte(v >> 48)

    b[7] = byte(v >> 56)

}


查看完整回答
反對(duì) 回復(fù) 2023-03-21
  • 1 回答
  • 0 關(guān)注
  • 98 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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