我有一個(gè)像這樣的字節(jié)片:mbBytes := 1048576x := make([]byte, 16 * mbBytes)我知道bytes.Trim(s []byte, cutset string)讓我們切掉所有前導(dǎo)和尾隨cutset事件的方法,但似乎這種方法很慢——從這樣的切片中刪除所有零大約需要 80 毫秒。我嘗試了下面的替代方法;func nonZeroLength(b []byte) int { a := 0 for _, v := range b { if v != 0 { a++ } } return a}這種方法比bytes.Trim().但是當(dāng) slice 填充了很多非零值時(shí)——這些方法非常慢。有沒有更快的算法或內(nèi)置方法從字節(jié)片中刪除零?
1 回答

德瑪西亞99
TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
正如其他人指出的那樣,“它的真實(shí)大小”和“計(jì)算所有非零字節(jié)”是不同的東西,但我將其保留為術(shù)語。
計(jì)算所有非零字節(jié)的一種快速方法是使用bytes.Count來計(jì)算零字節(jié)并將其從數(shù)組的長(zhǎng)度中減去。
non_zero_count = len(x) - bytes.Count(x, []byte("\x00"))
這比你的函數(shù)快大約 10 倍。
- 1 回答
- 0 關(guān)注
- 156 瀏覽
添加回答
舉報(bào)
0/150
提交
取消