Performance 计算字节片中所有非零字节的最快方法是什么

Performance 计算字节片中所有非零字节的最快方法是什么,performance,go,Performance,Go,我有这样一个字节片: mbBytes:=1048576 x:=make([]字节,16*MB字节) 我知道有bytes.Trim(s[]byte,cutset string)方法可以将所有前导和尾随的cutset事件切掉,但这种方法似乎非常慢——从这样的切块中删除所有零大约需要80毫秒 我尝试了下面的替代方法 func非零长度(b[]字节)int{ a:=0 对于u,v:=范围b{ 如果v!=0{ a++ } } 归还 } 此方法比bytes.Trim()快8-10倍 但当slice中填充了

我有这样一个字节片:

mbBytes:=1048576
x:=make([]字节,16*MB字节)
我知道有
bytes.Trim(s[]byte,cutset string)
方法可以将所有前导和尾随的
cutset
事件切掉,但这种方法似乎非常慢——从这样的切块中删除所有零大约需要80毫秒

我尝试了下面的替代方法

func非零长度(b[]字节)int{
a:=0
对于u,v:=范围b{
如果v!=0{
a++
}
}
归还
}
此方法比
bytes.Trim()快8-10倍

但当slice中填充了大量非零值时,这些方法的速度非常慢

有没有更快的算法或内置方法来删除字节片中的零?

正如其他人指出的,“它的真实大小”和“计算所有非零字节”是不同的东西,但我将把它作为术语

计算所有非零字节的一种快速方法是使用计数零字节并从数组长度中减去

non_zero_count = len(x) - bytes.Count(x, []byte("\x00"))

这比函数快10倍左右。

您填充的数据永远不会包含零,那么?(还有,您是如何设法以丢失写入字节数的方式填充它的?)“默认情况下,len(slice)将返回slice的最大容量,并且它不会显示一个slice中已经占用了多少空间。”不正确
cap(slice)
返回其容量,
len(slice)
返回其长度。“其真实大小”还包括零-字节
0
正好占用一个字节,与任何其他字节值相同。请注意
make([]字节,n)
生成长度为
n
的字节片。也许你想要
生成([]字节,0,n)
-一个长度为零的片,但初始容量
n
。我知道为什么这个Q被否决了(我想它不是要解决一个“问题”),但它实际上得到了一个有用且有趣的答案。