【问题标题】:Does enumerating a BitArray cause lots of boxing/unboxing?枚举 BitArray 会导致大量装箱/拆箱吗?
【发布时间】:2010-11-10 23:14:00
【问题描述】:
System.BitArray 仅实现非泛型 IEnumerable,它为 IEnumerator.Current 属性返回一个对象。是否在 BitArray 上运行 foreach - 例如
foreach (bool b in bitArray)
{
// ...
}
对每个位值进行装箱和拆箱?
查看反射器中的位数组枚举器,看起来它在每次调用 MoveNext() 时都做了一个新的位掩码,而不是更聪明的东西。有没有更有效的枚举 BitArray 的方法,或者有相同存储特性的 BitArray 的替代品? (List 等每个 bool 使用一个字节,而不是单个位,因此使用 8 倍的空间)
【问题讨论】:
标签:
.net
performance
ienumerable
bitarray
【解决方案1】:
是的,它会引起很多拳击。然而,在大多数情况下,我实际上并不认为这会对性能造成太大影响。这很烦人,但我怀疑许多现实世界的应用程序会花费大量时间装箱/拆箱(或事后清理箱子,这当然是另一项成本)。在你努力避免它之前,可能值得检查一下。
不过,您可以相当轻松地在其上编写自己的迭代器……特别是如果您不关心“版本”更改时是否会中断。例如:
public static IEnumerable<bool> EnumerateBitArray(BitArray bitArray)
{
for (int i=0; i < bitArray.Length; i++)
{
yield return bitArray[i];
}
}
如果您在迭代时确实更改数组,几乎肯定会发生坏事 - 特别是如果您更改长度!